Function Calling(tool use、ツール呼び出し)とは、LLM が「この関数を、この引数で呼んでほしい」という依頼を JSON で返し、呼び出し側のプログラムがその関数を実行して結果をモデルに戻す仕組みです。 モデル自身は関数を実行しません。実行するのも、結果を返すのも、あなたのプログラムです。

この記事では、この往復をシーケンス図と Anthropic・OpenAI の Python SDK で動かした最小のループで示し、JSON スキーマの書き方テンプレート、tool_choice・並列呼び出し・strict の対応表、エラー時の返し方、構造化出力や MCP との選び方までをまとめます。

確認環境(確認日 2026-10-06):Python 3.11、anthropic 1.11.0、openai 3.24.0、jsonschema 4.26.0。ループのコードは、両社の API の応答の形をまねて決まった応答を返す手元の模擬サーバーに SDK を接続して実行しました。記事中の出力はその結果で、モデルが生成した文章ではありません。パラメータ名と仕様は Anthropic・OpenAI の公式ドキュメントで確認し、シーケンス図は @mermaid-js/mermaid-cli 11.14.0 で描画できることを確かめています。

この記事の結論

  • モデルは関数を実行しません。 返すのは「関数名」と「引数の JSON」だけです。
  • 実装は 「モデルを呼ぶ → 呼び出しがあれば関数を実行 → 結果を履歴に足してもう一度呼ぶ」の繰り返しです。
  • モデルが関数を選ぶ手がかりは description と JSON スキーマです。ここを丁寧に書くほど、呼び出しが安定します。
  • 関数がエラーになったら、例外で止めずにエラーの内容を結果として返すと、モデルが引数を直して呼び直せます。

Function Calling の早見表

項目 Anthropic(Messages API) OpenAI(Responses API)
ツール定義の形 name・description・input_schema type: "function"・name・description・parameters・strict
モデルからの呼び出し content の中の tool_use ブロック(id・name・input) output の中の function_call(call_id・name・arguments)
引数の型 input は辞書 arguments は JSON 文字列(json.loads で読む)
呼び出しがあったかの判定 stop_reason == "tool_use" output に function_call があるか
結果の返し方 user メッセージの tool_result(tool_use_id・content・is_error) function_call_output(call_id・output)
結果の型 文字列、またはコンテンツブロックの配列 文字列
エラーの伝え方 is_error: true と説明文 エラーの内容を文字列にして output に入れる
使うツールの指定 tool_choice(auto・any・tool・none) tool_choice(auto・required・関数の指定・none・allowed_tools)
並列呼び出しを止める tool_choice の中の disable_parallel_tool_use: true parallel_tool_calls: false
スキーマどおりを保証 ツール定義に strict: true ツール定義に strict: true(Responses API では既定で有効)

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「Function Calling(tool use)の仕組みとPython実装」

仕組み:モデルは関数を実行しない

sequenceDiagram
    participant U as 利用者
    participant A as 呼び出し側のプログラム
    participant M as モデル(API)
    participant F as 自分の関数
    U->>A: 質問
    A->>M: 質問 + ツール定義(名前・説明・JSONスキーマ)
    M-->>A: 呼びたい関数名と引数のJSON
    Note over M: モデルは関数を実行しない
    A->>F: 引数を渡して実行
    F-->>A: 戻り値(またはエラー)
    A->>M: これまでの履歴 + 実行結果
    M-->>A: 結果をふまえた回答(または次の呼び出し)
    A-->>U: 回答

流れを言葉にすると次の5段階です。

段階 だれが 何をする
1 呼び出し側 質問と一緒に、使えるツールの定義(名前・説明・引数の JSON スキーマ)を送る
2 モデル ツールが必要だと判断したら、関数名と引数の JSON を返す
3 呼び出し側 その関数を自分の環境で実行する
4 呼び出し側 実行結果を、どの呼び出しへの答えかが分かる ID を付けて送り返す
5 モデル 結果をふまえて回答する。足りなければ、もう一度 2 に戻る

データベースへの接続情報や社内 API の認証は、すべて呼び出し側のプログラムの中にあります。 モデルに渡るのは、ツールの定義と、あなたが返した実行結果だけです。どの関数を公開し、どの引数を受け付けるかを呼び出し側で決められる点が、この仕組みの扱いやすさです。

最小のPythonループ(Anthropic と OpenAI)

題材は、架空の備品予約システムの「在庫を調べる関数」です。2つのコードで共通して使う部分を先に用意します。

共通:関数・スキーマ・実行用のヘルパー(tools_common.py)

import json

STOCK = {"PC-001": {"name": "ノートPC", "stock": 4}, "MN-002": {"name": "モニター", "stock": 0}}

def get_stock(item_code: str) -> dict:
    """備品コードから在庫数を返す。"""
    if item_code not in STOCK:
        raise KeyError(f"備品コード {item_code} は登録されていません。PC-001 のような形式で、登録済みのコードを指定してください。")
    return STOCK[item_code]

FUNCTIONS = {"get_stock": get_stock}

def run_tool(name: str, args: dict) -> tuple[str, bool]:
    """ツールを実行し、(結果の文字列, エラーかどうか) を返す。"""
    try:
        return json.dumps(FUNCTIONS[name](**args), ensure_ascii=False), False
    except Exception as e:
        msg = e.args[0] if e.args else str(e)
        return f"{type(e).__name__}: {msg}", True

PARAMETERS = {
    "type": "object",
    "properties": {
        "item_code": {
            "type": "string",
            "description": "備品コード。英大文字2字、ハイフン、数字3桁。例: PC-001",
        }
    },
    "required": ["item_code"],
    "additionalProperties": False,
}
DESCRIPTION = (
    "備品コードを指定して、現在の在庫数と品名を返す。"
    "利用者が備品の在庫や貸し出せる数を尋ねたときに使う。"
    "予約や貸出の登録は行わない。登録されていないコードではエラーを返す。"
)

run_tool は、例外をそのまま外に出さず、「結果の文字列」と「エラーかどうか」の組にして返します。 これが後で説明するエラー時の返し方の土台になります。

Anthropic の Python SDK

import os
import anthropic
from tools_common import run_tool, PARAMETERS, DESCRIPTION

# base_url を省くと Anthropic の API に接続する。ここでは手元の模擬サーバーを指定
client = anthropic.Anthropic(
    api_key=os.environ.get("ANTHROPIC_API_KEY", "dummy"),
    base_url=os.environ.get("ANTHROPIC_BASE_URL"),
)
MODEL = "claude-opus-5-5"  # 利用できるモデル名に置き換える

tools = [{"name": "get_stock", "description": DESCRIPTION, "input_schema": PARAMETERS}]
messages = [{"role": "user", "content": "PC-001 と ZZ-999 の在庫を教えてください。"}]

for turn in range(1, 6):  # 回り続けないように上限を置く
    response = client.messages.create(model=MODEL, max_tokens=1024, tools=tools, messages=messages)
    print(f"[{turn}回目] stop_reason = {response.stop_reason}")
    if response.stop_reason != "tool_use":
        break

    # 1) モデルの応答(tool_use を含む)をそのまま履歴に足す
    messages.append({"role": "assistant", "content": response.content})

    # 2) 呼び出し側が関数を実行し、tool_result を1つの user メッセージにまとめる
    tool_results = []
    for block in response.content:
        if block.type != "tool_use":
            continue
        result, is_error = run_tool(block.name, block.input)
        print(f"  実行: {block.name}({block.input}) -> {result}")
        tool_results.append(
            {"type": "tool_result", "tool_use_id": block.id, "content": result, "is_error": is_error}
        )
    messages.append({"role": "user", "content": tool_results})

print("最終応答:", "".join(b.text for b in response.content if b.type == "text"))

OpenAI の Python SDK(Responses API)

import json
import os
from openai import OpenAI
from tools_common import run_tool, PARAMETERS, DESCRIPTION

# base_url を省くと OpenAI の API に接続する。ここでは手元の模擬サーバーを指定
client = OpenAI(
    api_key=os.environ.get("OPENAI_API_KEY", "dummy"),
    base_url=os.environ.get("OPENAI_BASE_URL"),
)
MODEL = "gpt-6-astra"  # 利用できるモデル名に置き換える

tools = [{
    "type": "function",
    "name": "get_stock",
    "description": DESCRIPTION,
    "parameters": PARAMETERS,
    "strict": True,
}]
input_list = [{"role": "user", "content": "PC-001 と ZZ-999 の在庫を教えてください。"}]

for turn in range(1, 6):  # 回り続けないように上限を置く
    response = client.responses.create(model=MODEL, tools=tools, input=input_list)
    calls = [item for item in response.output if item.type == "function_call"]
    print(f"[{turn}回目] function_call = {len(calls)} 件")
    if not calls:
        break

    # 1) モデルの出力(function_call を含む)をそのまま入力に足す
    input_list += response.output

    # 2) 呼び出し側が関数を実行し、call_id を付けて結果を返す
    for call in calls:
        result, is_error = run_tool(call.name, json.loads(call.arguments))
        print(f"  実行: {call.name}({call.arguments}) -> {result}")
        input_list.append({"type": "function_call_output", "call_id": call.call_id, "output": result})

print("最終応答:", response.output_text)

実行結果

模擬サーバーは、1回目に「PC-001 と ZZ-999 の在庫を調べる」という2件の呼び出しを返し、結果を受け取ると決まった文章を返します。ZZ-999 は登録のないコードなので、関数はエラーになります。

$ ANTHROPIC_BASE_URL=http://127.0.0.1:10300 python3 loop_anthropic.py
[1回目] stop_reason = tool_use
  実行: get_stock({'item_code': 'PC-001'}) -> {"name": "ノートPC", "stock": 4}
  実行: get_stock({'item_code': 'ZZ-999'}) -> KeyError: 備品コード ZZ-999 は登録されていません。PC-001 のような形式で、登録済みのコードを指定してください。
[2回目] stop_reason = end_turn
最終応答: (模擬サーバーの固定応答)tool_result を 2 件受け取りました。成功 1 件、エラー 1 件。

$ OPENAI_BASE_URL=http://127.0.0.1:10300/v1 python3 loop_openai.py
[1回目] function_call = 2 件
  実行: get_stock({"item_code": "PC-001"}) -> {"name": "ノートPC", "stock": 4}
  実行: get_stock({"item_code": "ZZ-999"}) -> KeyError: 備品コード ZZ-999 は登録されていません。PC-001 のような形式で、登録済みのコードを指定してください。
[2回目] function_call = 0 件
最終応答: (模擬サーバーの固定応答)function_call_output を 2 件受け取りました。

2つのコードの骨組みは同じです。

手順 Anthropic OpenAI
モデルの応答を履歴に足す messages.append({"role": "assistant", "content": response.content}) input_list += response.output
呼び出しを取り出す block.type == "tool_use" item.type == "function_call"
引数を読む block.input(辞書) json.loads(call.arguments)
結果を返す tool_result を1つの user メッセージにまとめる function_call_output を1件ずつ足す
対応づける ID tool_use_id に block.id call_id に call.call_id

ループに回数の上限(ここでは5回)を置いておくと、呼び出しが続いた場合でも必ず終わります。実際の API に接続するときは、base_url の指定を外し、API キーを環境変数に設定します。

JSONスキーマの書き方テンプレート

ツールの引数は JSON スキーマで定義します。次のテンプレートは、文字列・整数・enum・入れ子のオブジェクト・配列・省略できる項目をひととおり含んでいます。

reserve_item = {
    "type": "object",
    "properties": {
        "item_code": {
            "type": "string",
            "description": "備品コード。英大文字2字、ハイフン、数字3桁。例: PC-001",
        },
        "quantity": {
            "type": "integer",
            "description": "予約する台数。1以上の整数",
        },
        "priority": {
            "type": "string",
            "enum": ["low", "normal", "high"],
            "description": "優先度。指定がなければ normal",
        },
        "period": {
            "type": "object",
            "description": "貸出期間",
            "properties": {
                "start": {"type": "string", "description": "開始日。YYYY-MM-DD 形式"},
                "end": {"type": "string", "description": "終了日。YYYY-MM-DD 形式"},
            },
            "required": ["start", "end"],
            "additionalProperties": False,
        },
        "accessories": {
            "type": "array",
            "description": "一緒に借りる付属品。不要なら空の配列",
            "items": {"type": "string", "enum": ["charger", "mouse", "bag"]},
        },
        "note": {
            "type": ["string", "null"],
            "description": "連絡事項。なければ null",
        },
    },
    "required": ["item_code", "quantity", "priority", "period", "accessories", "note"],
    "additionalProperties": False,
}
書くもの 書き方 ねらい
ツールの description 何をするか、いつ使うか、何をしないか、エラーになる条件 モデルがツールを選ぶ判断材料になる
引数の description 意味・形式・例(「YYYY-MM-DD 形式」「例: PC-001」) 引数の形がそろう
enum 取りうる値を配列で列挙する 決まった値以外が入らない
required 必ず渡してほしい引数の名前を並べる 不足に気づける
入れ子 type: "object" の中に properties を書く 関連する値をまとめる
配列 type: "array" と items で要素の型を書く 複数の値を受け取る
省略できる項目 型を ["string", "null"] にして required に入れる strict を使うときの書き方(後述)
additionalProperties: false オブジェクトごとに書く 定義にない引数を受け付けない

Anthropic の公式ドキュメントは、ツールの説明を詳しく書くことが性能にいちばん効くとして、何をするか・いつ使うか(使わないか)・各引数の意味・注意点を、3〜4文以上で書くことを勧めています。OpenAI の公式ガイドも、いつ・どう使うかを説明に書くこと、enum やオブジェクトの構造でありえない状態を作らせないことを挙げています。

description の書き分けの例です。

短い説明 書き足した説明
在庫を取得する 備品コードを指定して、現在の在庫数と品名を返す。利用者が備品の在庫や貸し出せる数を尋ねたときに使う。予約や貸出の登録は行わない。登録されていないコードではエラーを返す。

受け取った引数を呼び出し側で検証する

strict を使わない場合、引数がスキーマどおりである保証はありません。関数に渡す前に、同じスキーマで検証できます。上のテンプレートに3通りの引数を通した結果です(jsonschema 4.26.0)。

from jsonschema import Draft202012Validator

# reserve_item は上のテンプレート
Draft202012Validator.check_schema(reserve_item)
validator = Draft202012Validator(reserve_item)

samples = {
    "正しい引数": {
        "item_code": "PC-001", "quantity": 2, "priority": "high",
        "period": {"start": "2026-10-13", "end": "2026-10-15"},
        "accessories": ["charger", "mouse"], "note": None,
    },
    "enum にない値": {
        "item_code": "PC-001", "quantity": 2, "priority": "urgent",
        "period": {"start": "2026-10-13", "end": "2026-10-15"},
        "accessories": [], "note": None,
    },
    "必須の不足と型違い": {
        "item_code": "PC-001", "quantity": "2", "priority": "normal",
        "period": {"start": "2026-10-13"},
        "accessories": ["desk"],
    },
}
for label, args in samples.items():
    errors = sorted(validator.iter_errors(args), key=lambda e: list(e.path))
    print(f"■ {label}: {'OK' if not errors else str(len(errors)) + ' 件'}")
    for e in errors:
        where = "/".join(str(p) for p in e.path) or "(全体)"
        print(f"  {where}: {e.message}")
■ 正しい引数: OK
■ enum にない値: 1 件
  priority: 'urgent' is not one of ['low', 'normal', 'high']
■ 必須の不足と型違い: 4 件
  (全体): 'note' is a required property
  accessories/0: 'desk' is not one of ['charger', 'mouse', 'bag']
  period: 'end' is a required property
  quantity: '2' is not of type 'integer'

このエラー文をそのまま結果としてモデルに返すと、どの引数をどう直せばよいかが伝わります。

tool_choice・並列呼び出し・strict の対応表

tool_choice:ツールを使うかどうかを指定する

やりたいこと Anthropic OpenAI(Responses API)
モデルに任せる(既定) {"type": "auto"} "auto"
必ずどれかのツールを呼ばせる {"type": "any"} "required"
特定のツールを必ず呼ばせる {"type": "tool", "name": "get_stock"} {"type": "function", "name": "get_stock"}
ツールを使わせない {"type": "none"} "none"
使ってよいツールを一部に絞る ― {"type": "allowed_tools", "mode": "auto", "tools": [...]}

Anthropic の公式ドキュメントには、一部のモデルでは any と tool を指定すると 400 エラーになり、代わりに auto と strict を組み合わせるという記載があります(2026-10-06 確認)。使うモデルのページで対応を確かめてから指定します。

並列呼び出し:1回の応答に複数の呼び出しが入る

どちらの API も、既定では1回の応答に複数の呼び出しが入ることがあります。上の実行結果でも、1回目に2件の呼び出しが返っています。

項目 Anthropic OpenAI
止める指定 tool_choice={"type": "auto", "disable_parallel_tool_use": True} parallel_tool_calls=False
止めたときの呼び出し数 auto では多くて1件、any・tool ではちょうど1件 0件か1件
結果の返し方 すべての tool_result を1つの user メッセージにまとめる。tool_result はテキストより前に置く 呼び出しごとに function_call_output を足す
実行の順序 呼び出し側が決める(同時でも順番でもよい) 呼び出し側が決める

Anthropic の公式ドキュメントは、読み取りだけの独立した処理は同時に実行しやすく、副作用のある処理や順序に意味がある処理は順番に実行するほうがよいと整理しています。結果を別々のメッセージに分けて返すと、その後の並列呼び出しが減るとも書かれています。

strict:引数をスキーマどおりにそろえる

項目 Anthropic OpenAI(Responses API)
指定の場所 ツール定義の最上位に "strict": True ツール定義に "strict": True
既定 指定したときに有効 既定で有効
スキーマの条件 additionalProperties: false が必要。使える JSON スキーマは一部 additionalProperties: false、すべての項目を required に入れる
省略できる項目 ― 型に null を加える({"type": ["string", "null"]})

Anthropic のドキュメントでは、strict を有効にするとツールの input がスキーマに厳密に従い、ツール名も必ず有効なものになると説明されています。構造化出力のページには、minimum・maximum・minLength・maxLength のような制約は対象外とあるので、数値の範囲や文字数は description に書いたうえで、呼び出し側でも検証する形にします。

ツール実行がエラーになったときの結果の返し方

関数が例外を出しても、ループを止めずに結果として返します。

Anthropic:tool_result に is_error: true を付け、content に説明を入れます。

{
    "type": "tool_result",
    "tool_use_id": block.id,
    "content": "KeyError: 備品コード ZZ-999 は登録されていません。PC-001 のような形式で、登録済みのコードを指定してください。",
    "is_error": True,
}

OpenAI:結果は文字列で返す決まりなので、エラーの内容を文字列にして output に入れます。

{
    "type": "function_call_output",
    "call_id": call.call_id,
    "output": "KeyError: 備品コード ZZ-999 は登録されていません。PC-001 のような形式で、登録済みのコードを指定してください。",
}
場面 返す内容の例
引数が足りない・形式が違う どの引数が、どういう形式であるべきか
対象が見つからない 見つからなかった値と、指定できる値の形式
外部の処理が一時的に応答しない 一時的なエラーであることと、何秒後に再度試せるか
権限がない その操作は行えないことと、代わりにできること
存在しないツール名が返ってきた 使えるツール名の一覧

Anthropic の公式ドキュメントは、「failed」のような一言ではなく、何が起きたかと次に何を試せばよいかを書くことを勧めています。必須の引数が欠けた呼び出しにエラーを返すと、モデルは2〜3回修正を試みるとも説明されています。

構造化出力・MCP との違いと選び方

仕組み 目的 外部の処理の実行 だれが実行するか
構造化出力 モデルの回答の形を JSON スキーマで固定する しない ―
Function Calling(tool use) モデルが外部の処理を依頼できるようにする する 呼び出し側のプログラム
MCP ツールやデータを共通の方式でつなぐ。AI アプリケーションと外部のシステムを接続するオープンな標準 する MCP サーバー

Anthropic のドキュメントは、JSON 出力を「モデルが何を答えるか」の形式を決めるもの、strict なツール利用を「モデルが関数をどう呼ぶか」を検証するものと区別しています。MCP は、公式サイトで「AI アプリケーションを外部のシステムにつなぐためのオープンソースの標準」と説明されています。

条件 選ぶもの
抽出・分類の結果を決まった形の JSON で受け取りたいだけ 構造化出力
検索・計算・登録など、自分のプログラムの関数を呼ばせたい Function Calling
関数を呼ばせたうえで、引数の形も保証したい Function Calling + strict
同じツールを複数の AI アプリケーションで共有したい MCP サーバーとして用意する
1つのアプリの中だけで使う、数個の関数 Function Calling

MCP でつないだツールも、モデルから見れば「名前・説明・引数のスキーマを持つツール」です。description とスキーマを丁寧に書くという要点は、どの仕組みでも共通です。

確かめて分かったこと

  • 引数の型が2社で違います。 Anthropic の block.input は辞書でそのまま関数に渡せましたが、OpenAI の call.arguments は JSON 文字列で、json.loads が必要でした。
  • 応答を履歴に足す書き方も違います。 Anthropic は response.content を assistant メッセージとして足し、OpenAI は response.output をそのまま入力のリストに足します。どちらも SDK が返したオブジェクトをそのまま渡せました。
  • 1回の応答に2件の呼び出しが入っていても、ループは1周で済みます。 呼び出しを1件ずつ処理する前提で書くと、2件目の結果を返しそびれます。
  • KeyError を str() で文字列にすると、メッセージが引用符つきになります。 エラー文をモデルに返すときは e.args[0] を使うと、そのままの文章になりました。
  • jsonschema の検証エラーは、場所と理由が1行で出ます(quantity: '2' is not of type 'integer' など)。そのまま結果として返せる形です。
  • strict 用のスキーマでは、省略できる項目も required に入れます。 note を省いた引数は「'note' is a required property」になりました。値がないときは null を渡してもらいます。

よくある質問

Q. Function Calling とは何ですか? A. LLM が、呼びたい関数の名前と引数を JSON で返す仕組みです。モデルは関数を実行せず、呼び出し側のプログラムが実行して結果をモデルに返します。Anthropic では tool use、OpenAI では function calling(tool calling)と呼ばれます。

Q. Function Calling と tool use の違いは何ですか? A. 呼び方の違いで、仕組みは同じです。ツール定義のキー名(input_schema と parameters)や、結果の返し方(tool_result と function_call_output)といった書式が API ごとに異なります。

Q. モデルが関数を呼んでくれないときは何を見直しますか? A. まず description を見直します。何をするツールで、どんな質問のときに使うのかを具体的に書き足します。必ず呼ばせたい場合は tool_choice で指定できます。

Q. 関数の実行結果は何を返せばよいですか? A. モデルが次の回答に使う情報を、文字列(多くは JSON 文字列)で返します。エラーのときも、何が起きたかと次に試せることを文章で返します。

まとめ

  • モデルは関数を実行しません。 関数名と引数の JSON を返すだけで、実行と結果の返却は呼び出し側の役目です。
  • 実装は「呼ぶ → 実行 → 結果を足して再度呼ぶ」のループで、回数の上限を置きます。
  • description とスキーマが、モデルがツールを選ぶ手がかりです。enum と required でありえない引数を減らします。
  • 1回の応答に複数の呼び出しが入ることを前提に書きます。
  • strict を使うと引数がスキーマどおりにそろいます。数値の範囲などは呼び出し側でも検証します。
  • エラーは結果として返し、次に試せることを書きます。
  • 形を固定したいだけなら構造化出力、ツールを複数のアプリで共有するなら MCP を選びます。

参考・出典

  • Anthropic「Define tools」(ツール定義・tool_choice) https://platform.claude.com/docs/en/agents-and-tools/tool-use/implement-tool-use
  • Anthropic「Handle tool calls」 https://platform.claude.com/docs/en/agents-and-tools/tool-use/handle-tool-calls
  • Anthropic「Parallel tool use」 https://platform.claude.com/docs/en/agents-and-tools/tool-use/parallel-tool-use
  • Anthropic「Strict tool use」 https://platform.claude.com/docs/en/agents-and-tools/tool-use/strict-tool-use
  • Anthropic「Structured outputs」 https://platform.claude.com/docs/en/build-with-claude/structured-outputs
  • OpenAI「Function calling」 https://developers.openai.com/api/docs/guides/function-calling
  • Model Context Protocol「What is the Model Context Protocol (MCP)?」 https://modelcontextprotocol.io/docs/getting-started/intro

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「Function Calling(tool use)の仕組みとPython実装」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?