bizgate-mcp-server 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,161 +1,221 @@
1
1
  # bizgate-mcp-server
2
2
 
3
3
  BizGate API と Claude を接続する MCP サーバーです。
4
- 会社名・法人番号で企業情報・部署・人事情報を検索し、Claude が自然言語で回答できるようにします。
4
+ Claude に話しかけるだけで、企業の情報を調べられるようになります。
5
5
 
6
- ## 仕組み
6
+ ```
7
+ 例:
8
+ 「株式会社エージェントの電話番号を教えて」
9
+ 「富士フイルムBIの営業部署を一覧で出して」
10
+ 「この会社の全情報を調べて、Excelに入れて」
11
+ ```
12
+
13
+ ### 仕組み
7
14
 
8
15
  ```
9
- [ユーザー] → [Claude] ←── MCP (stdio) ──→ [本サーバー] ──→ [BizGate API]
16
+ [ユーザー] → [Claude] ←── MCP ──→ [本サーバー] ──→ [BizGate API]
10
17
  ```
11
18
 
12
- 1. ユーザーが Claude に「○○の人事部の電話番号を教えて」と依頼
13
- 2. Claude が MCP プロトコル経由で本サーバーのツールを呼び出す
14
- 3. 本サーバーが BizGate API に問い合わせ → JSON レスポンスを解析
15
- 4. 構造化された情報を Claude に返却
16
- 5. Claude がユーザーに自然言語で回答(スプレッドシートへの入力も可能)
19
+ ---
17
20
 
18
- ## 提供ツール
21
+ ## セットアップ(所要時間:約10分)
19
22
 
20
- | ツール名 | 説明 | API消費 |
21
- |---------|------|--------|
22
- | `bizgate__company_search` | 企業の基本情報(住所・電話・代表者・業種・資本金 等) | 1回(結果なしでも課金) |
23
- | `bizgate__department_search` | 部署情報(部署名・住所・電話番号)最大500件 | 1回(データなしは課金なし) |
24
- | `bizgate__marketing_tags` | マーケティングタグ(SNS・MA・サービス・活動) | 1回(データなしは課金なし) |
25
- | `bizgate__keyman_search` | 人事情報(部署・役職・発令日)最大500件 | 1回(データなしは課金なし) |
26
- | `bizgate__company_full` | 企業+部署+人事を一括取得 | 3回 |
27
- | `bizgate__usage_status` | 本日の残りAPI回数を確認 | 0回 |
23
+ ### 事前に必要なもの
28
24
 
29
- ## セットアップ
25
+ - **Claude Code** がパソコンにインストール済み
26
+ - **Node.js 18 以上** がインストール済み
27
+ - **BizGate のアカウント情報**(管理者から受け取ってください)
28
+ - ユーザー名
29
+ - パスワード
30
+ - サービスキー(企業用・部署用の2つ)
30
31
 
31
- ### 前提条件
32
+ ---
32
33
 
33
- - Node.js 18 以上
34
- - Claude Code がインストール済み
35
- - BizGate API のアカウント(ユーザー名・パスワード・サービスキー)
34
+ ### ステップ 1:ターミナルを開く
36
35
 
37
- ### 1. リポジトリをクローン&ビルド
36
+ Mac の場合:
37
+ 1. `Command + Space` で Spotlight を開く
38
+ 2. 「ターミナル」と入力して Enter
38
39
 
39
- ```bash
40
- git clone https://github.com/digiman-hq/bizgate-mcp-server.git
41
- cd bizgate-mcp-server
42
- npm install
43
- npm run build
40
+ ---
41
+
42
+ ### ステップ 2:MCP サーバーを登録する
43
+
44
+ ターミナルに以下を **そのままコピーして貼り付け** → Enter を押してください。
45
+
46
+ ```
47
+ claude mcp add --scope user bizgate -- npx bizgate-mcp-server
48
+ ```
49
+
50
+ 以下のように表示されれば OK です。
51
+ ```
52
+ Added stdio MCP server bizgate...
44
53
  ```
45
54
 
46
- ### 2. Claude Code に MCP サーバーを登録
55
+ ---
47
56
 
48
- 以下のコマンドを **1行ずつ** 実行してください。サービスキーの値は管理者から受け取ってください。
57
+ ### ステップ 3:設定ファイルを編集する
49
58
 
50
- ```bash
51
- claude mcp add --scope user bizgate \
52
- --transport stdio \
53
- -- node /path/to/bizgate-mcp-server/dist/index.js
59
+ ターミナルに以下を **そのままコピーして貼り付け** → Enter を押してください。
60
+
61
+ ```
62
+ open ~/.claude.json
54
63
  ```
55
64
 
56
- > **注意**: 上記コマンドでは環境変数が設定されません。次のステップで手動設定が必要です。
65
+ テキストエディタで設定ファイルが開きます。
66
+
67
+ ファイルの中から `"bizgate"` というセクションを探してください。
68
+ 以下のように **書き換え** ます。
69
+
70
+ #### 書き換え前
57
71
 
58
- ### 3. 環境変数を設定
72
+ ```json
73
+ "bizgate": {
74
+ "type": "stdio",
75
+ "command": "npx",
76
+ "args": ["bizgate-mcp-server"],
77
+ "env": {}
78
+ }
79
+ ```
59
80
 
60
- `~/.claude.json` を開き、`mcpServers.bizgate` の `env` セクションに以下を設定します。
81
+ #### 書き換え後
61
82
 
62
83
  ```json
63
- {
64
- "mcpServers": {
65
- "bizgate": {
66
- "type": "stdio",
67
- "command": "node",
68
- "args": ["/path/to/bizgate-mcp-server/dist/index.js"],
69
- "env": {
70
- "BIZGATE_USERNAME": "あなたのユーザー名",
71
- "BIZGATE_PASSWORD": "あなたのパスワード",
72
- "BIZGATE_AUTH_MODE": "basic",
73
- "BIZGATE_DAILY_LIMIT": "200",
74
- "BIZGATE_SKEY_COMPANY": "企業APIのサービスキー",
75
- "BIZGATE_SKEY_DEPARTMENT": "部署APIのサービスキー",
76
- "BIZGATE_SKEY_MARKETING": "マーケAPIのサービスキー(任意)",
77
- "BIZGATE_SKEY_KEYMAN": "キーマンAPIのサービスキー(任意)"
78
- }
79
- }
84
+ "bizgate": {
85
+ "type": "stdio",
86
+ "command": "npx",
87
+ "args": ["bizgate-mcp-server"],
88
+ "env": {
89
+ "BIZGATE_USERNAME": "ここにユーザー名を入力",
90
+ "BIZGATE_PASSWORD": "ここにパスワードを入力",
91
+ "BIZGATE_AUTH_MODE": "basic",
92
+ "BIZGATE_DAILY_LIMIT": "200",
93
+ "BIZGATE_SKEY_COMPANY": "ここに企業APIキーを入力",
94
+ "BIZGATE_SKEY_DEPARTMENT": "ここに部署APIキーを入力"
80
95
  }
81
96
  }
82
97
  ```
83
98
 
84
- > `/path/to/` はクローンした実際のパスに置き換えてください。
99
+ > **注意(よくあるミス)**
100
+ > - `ここに〇〇を入力` の部分を、管理者から受け取った **実際の値** に置き換えてください
101
+ > - ダブルクォーテーション `"` は **消さないで** ください
102
+ > - カンマ `,` の位置を **変えないで** ください
103
+ > - 最後の行(`"BIZGATE_SKEY_DEPARTMENT"` の行)の末尾には **カンマをつけないで** ください
104
+ > - 編集後、`Command + S` で保存 → ファイルを閉じる
85
105
 
86
- ### 4. Claude Code を再起動して確認
106
+ ---
87
107
 
88
- ```bash
108
+ ### ステップ 4:Claude Code を再起動する
109
+
110
+ もし Claude Code が開いている場合は、一度閉じてください。
111
+
112
+ ターミナルで以下を実行してください。
113
+
114
+ ```
89
115
  claude
90
116
  ```
91
117
 
92
- 起動後、`/mcp` コマンドで `bizgate` が **connected** になっていれば成功です。
118
+ ---
93
119
 
94
- ## 使い方
95
-
96
- Claude Code で自然言語で聞くだけです。
120
+ ### ステップ 5:接続を確認する
97
121
 
98
- ### 基本的な使い方
122
+ Claude Code が起動したら、以下を入力してください。
99
123
 
100
124
  ```
101
- エージェントの企業情報を教えて
125
+ /mcp
126
+ ```
102
127
 
103
- 富士フイルムBIの営業部署を調べて
128
+ 一覧が表示されます。 `bizgate` の横に **✔ connected** と表示されていれば成功です。
104
129
 
105
- GMOインターネットのマーケティングタグを教えて
106
- ```
130
+ うまくいかない場合は、このページの一番下の「うまくいかないとき」を確認してください。
107
131
 
108
- ### 部署の絞り込み
132
+ ---
109
133
 
110
- ```
111
- 富士フイルムBIの東京都にある人事部を調べて
134
+ ## 使い方
112
135
 
113
- トヨタ自動車の経理と総務の部署情報を教えて
114
- ```
136
+ 設定完了後は、Claude に **日本語で話しかけるだけ** です。特別なコマンドは不要です。
115
137
 
116
- ### 一括取得
138
+ ### よく使うパターン
117
139
 
118
- ```
119
- 株式会社エージェントの全情報を調べて
120
- (→ 企業情報・部署・人事情報をまとめて取得)
121
- ```
140
+ | やりたいこと | Claude への聞き方 |
141
+ |------------|-----------------|
142
+ | 会社の基本情報を知りたい | 「株式会社○○の企業情報を教えて」 |
143
+ | 電話番号を知りたい | 「○○の電話番号は?」 |
144
+ | 部署の一覧を見たい | 「○○の部署一覧を出して」 |
145
+ | 特定の部署を探したい | 「○○の人事部の連絡先を教えて」 |
146
+ | 全情報をまとめて見たい | 「○○の全情報を調べて」 |
147
+ | Excelに入力したい | 「○○の情報を調べてExcelに入れて」 |
122
148
 
123
- ### スプレッドシートとの連携
149
+ ### 注意点
124
150
 
125
- ```
126
- エージェントの企業情報を調べて、Excelに入力して
151
+ - **会社名は正確に** 入力してください(例:「ソフバン」→ 「ソフトバンク株式会社」)
152
+ - 1日に使える回数は **200回** までです(残り回数は毎回表示されます)
153
+ - 企業検索は、結果が見つからなくても **1回分消費** されます
154
+ - 部署検索・人事検索は、データが見つからなかった場合は **消費されません**
127
155
 
128
- このリストの会社の電話番号をスプレッドシートのB列に入れて
129
- ```
156
+ ---
157
+
158
+ ## 提供ツール(参考情報)
159
+
160
+ 通常はツール名を意識する必要はありません。Claude が自動で適切なツールを選びます。
161
+
162
+ | ツール名 | 説明 | API消費 |
163
+ |---------|------|--------|
164
+ | `bizgate__company_search` | 企業の基本情報(住所・電話・代表者・業種・資本金 等) | 1回 |
165
+ | `bizgate__department_search` | 部署情報(部署名・住所・電話番号)最大500件 | 1回 |
166
+ | `bizgate__marketing_tags` | マーケティングタグ(SNS・MA・サービス・活動) | 1回 |
167
+ | `bizgate__keyman_search` | 人事情報(部署・役職・発令日)最大500件 | 1回 |
168
+ | `bizgate__company_full` | 企業+部署+人事を一括取得 | 3回 |
169
+ | `bizgate__usage_status` | 本日の残りAPI回数を確認 | 0回 |
170
+
171
+ ---
130
172
 
131
- ## 環境変数一覧
173
+ ## 環境変数一覧(参考情報)
132
174
 
133
175
  | 変数名 | 必須 | 説明 |
134
176
  |-------|------|------|
135
- | `BIZGATE_USERNAME` | ○(basic認証時) | BizGate ユーザー名 |
136
- | `BIZGATE_PASSWORD` | ○(basic認証時) | BizGate パスワード |
177
+ | `BIZGATE_USERNAME` | | BizGate ユーザー名 |
178
+ | `BIZGATE_PASSWORD` | | BizGate パスワード |
137
179
  | `BIZGATE_AUTH_MODE` | | `basic`(デフォルト)または `ip` |
138
- | `BIZGATE_APP` | ○(IP認証時) | アプリ識別子 |
180
+ | `BIZGATE_APP` | ○(IP認証時のみ) | アプリ識別子 |
139
181
  | `BIZGATE_SKEY_COMPANY` | ○ | 企業APIのサービスキー |
140
182
  | `BIZGATE_SKEY_DEPARTMENT` | ○ | 部署APIのサービスキー |
141
183
  | `BIZGATE_SKEY_MARKETING` | | マーケティングタグAPIのサービスキー |
142
184
  | `BIZGATE_SKEY_KEYMAN` | | キーマンAPIのサービスキー |
143
185
  | `BIZGATE_DAILY_LIMIT` | | 1日のAPI上限(デフォルト: 200) |
144
- | `BIZGATE_BASE_URL` | | APIエンドポイント(通常変更不要) |
145
186
 
146
- ## API利用上の注意
187
+ ---
188
+
189
+ ## うまくいかないとき
190
+
191
+ ### `/mcp` で `bizgate` が `failed` になっている
192
+
193
+ ステップ 3 の設定ファイルに入力ミスがある可能性が高いです。以下を確認してください。
194
+
195
+ - ダブルクォーテーション `"` が抜けていないか
196
+ - カンマ `,` が余分についていないか(特に **最後の行の末尾**)
197
+ - ユーザー名・パスワード・サービスキーが正しいか
198
+
199
+ 確認しても直らない場合は、管理者に `~/.claude.json` の中身を見せて相談してください。
200
+
201
+ ### 「サービスキーが無効です」と表示される
202
+
203
+ サービスキーが間違っている、または有効期限切れです。管理者に確認してください。
204
+
205
+ ### 「1日のリクエスト上限に達しました」と表示される
206
+
207
+ 本日の利用回数(200回)を使い切りました。翌日にリセットされます。
208
+
209
+ ### 「該当する企業が見つかりませんでした」と表示される
210
+
211
+ 会社名を **正式名称** で入力してみてください。
212
+ - 悪い例:「トヨタ」
213
+ - 良い例:「トヨタ自動車株式会社」
214
+
215
+ 法人番号がわかる場合は、そちらでも検索できます。
147
216
 
148
- - **企業検索は結果なしでも課金**されます。会社名は正確に入力してください
149
- - **部署・マーケ・キーマンはデータなしなら課金なし**です
150
- - 1日のAPI上限はエンリッチメントパイプラインと共有です(全体900回中、MCP用に200回を確保)
151
- - すべてのレスポンスに残りAPI回数が表示されます
217
+ ### 「複数の企業が存在します」と表示される
152
218
 
153
- ## トラブルシューティング
219
+ 検索条件が曖昧で、複数の企業がヒットしています。
220
+ 会社名をより正確に入力するか、メールアドレスやホームページURLを追加で伝えてください。
154
221
 
155
- | 症状 | 原因 | 対処法 |
156
- |------|------|--------|
157
- | `/mcp` で `failed` | 環境変数の設定ミス | `~/.claude.json` の env を確認 |
158
- | エラーコード 102 | サービスキーが無効 | 管理者に有効なサービスキーを確認 |
159
- | エラーコード 112 | 1日の上限超過 | 翌日まで待つ、または上限を確認 |
160
- | エラーコード 204 | 企業が見つからない | 正式名称(株式会社○○)で再検索 |
161
- | エラーコード 205 | 複数企業がマッチ | 法人番号やメールアドレスを追加で指定 |
@@ -65,4 +65,29 @@ export declare class BizGateClient {
65
65
  docs: BizGateDoc[];
66
66
  numFound: number;
67
67
  }>;
68
+ /**
69
+ * Keyman with name lookup (キーマン・人名あり).
70
+ * Two-step flow: uses IDs from searchKeyman() to get person names.
71
+ * Not billed on failure.
72
+ */
73
+ getKeymanDetails(keymanIDs: string[]): Promise<{
74
+ docs: BizGateDoc[];
75
+ }>;
76
+ /**
77
+ * Full keyman search with names (2-step).
78
+ * Step 1: searchKeyman() to get IDs
79
+ * Step 2: getKeymanDetails() to get names for each ID
80
+ */
81
+ searchKeymanWithNames(params: {
82
+ shogo?: string;
83
+ compno?: string;
84
+ pList?: string;
85
+ cList?: string;
86
+ bKwd?: string;
87
+ bKOpr?: string;
88
+ limit?: number;
89
+ }): Promise<{
90
+ docs: BizGateDoc[];
91
+ totalFound: number;
92
+ }>;
68
93
  }
@@ -137,4 +137,49 @@ export class BizGateClient {
137
137
  numFound: result.response?.numFound ?? 0,
138
138
  };
139
139
  }
140
+ /**
141
+ * Keyman with name lookup (キーマン・人名あり).
142
+ * Two-step flow: uses IDs from searchKeyman() to get person names.
143
+ * Not billed on failure.
144
+ */
145
+ async getKeymanDetails(keymanIDs) {
146
+ const allDocs = [];
147
+ for (const id of keymanIDs) {
148
+ this.usageTracker.increment();
149
+ const result = await this.request(this.config.skeyKeymanName, {
150
+ keymanID: id,
151
+ });
152
+ if (result.response?.docs) {
153
+ allDocs.push(...result.response.docs);
154
+ }
155
+ }
156
+ return { docs: allDocs };
157
+ }
158
+ /**
159
+ * Full keyman search with names (2-step).
160
+ * Step 1: searchKeyman() to get IDs
161
+ * Step 2: getKeymanDetails() to get names for each ID
162
+ */
163
+ async searchKeymanWithNames(params) {
164
+ // Step 1: Get IDs
165
+ const { docs: keymanDocs, numFound } = await this.searchKeyman({
166
+ shogo: params.shogo,
167
+ compno: params.compno,
168
+ pList: params.pList,
169
+ cList: params.cList,
170
+ bKwd: params.bKwd,
171
+ bKOpr: params.bKOpr,
172
+ });
173
+ if (keymanDocs.length === 0) {
174
+ return { docs: [], totalFound: 0 };
175
+ }
176
+ // Step 2: Get details with names (limit to avoid excessive API calls)
177
+ const maxDetails = params.limit ?? 10;
178
+ const ids = keymanDocs
179
+ .slice(0, maxDetails)
180
+ .map((d) => d.id)
181
+ .filter((id) => !!id);
182
+ const { docs: detailDocs } = await this.getKeymanDetails(ids);
183
+ return { docs: detailDocs, totalFound: numFound };
184
+ }
140
185
  }
package/dist/index.js CHANGED
@@ -12,6 +12,7 @@ const skeyCompany = process.env.BIZGATE_SKEY_COMPANY;
12
12
  const skeyDepartment = process.env.BIZGATE_SKEY_DEPARTMENT;
13
13
  const skeyMarketing = process.env.BIZGATE_SKEY_MARKETING ?? "";
14
14
  const skeyKeyman = process.env.BIZGATE_SKEY_KEYMAN ?? "";
15
+ const skeyKeymanName = process.env.BIZGATE_SKEY_KEYMAN_NAME ?? "";
15
16
  if (!skeyCompany || !skeyDepartment) {
16
17
  console.error("Error: BIZGATE_SKEY_COMPANY and BIZGATE_SKEY_DEPARTMENT environment variables are required");
17
18
  process.exit(1);
@@ -39,6 +40,7 @@ const config = {
39
40
  skeyDepartment,
40
41
  skeyMarketing,
41
42
  skeyKeyman,
43
+ skeyKeymanName,
42
44
  authMode,
43
45
  username: process.env.BIZGATE_USERNAME,
44
46
  password: process.env.BIZGATE_PASSWORD,
@@ -247,14 +249,21 @@ server.tool("bizgate__marketing_tags", "会社名または法人番号で企業
247
249
  const lines = [`## マーケティングタグ: ${f(doc.shogo)}`];
248
250
  if (doc.compno)
249
251
  lines.push(`法人番号: ${doc.compno}`);
252
+ const formatTags = (raw) => {
253
+ return raw
254
+ .split("/")
255
+ .filter((t) => t.trim())
256
+ .map((t) => `- ${t.trim()}`)
257
+ .join("\n");
258
+ };
250
259
  if (doc.snstag)
251
- lines.push(`\n### SNSタグ\n${doc.snstag.replace(/¥\//g, "\n- ").replace(/^/, "- ")}`);
260
+ lines.push(`\n### SNSタグ\n${formatTags(doc.snstag)}`);
252
261
  if (doc.matag)
253
- lines.push(`\n### MAツール\n${doc.matag.replace(/¥\//g, "\n- ").replace(/^/, "- ")}`);
262
+ lines.push(`\n### MAツール\n${formatTags(doc.matag)}`);
254
263
  if (doc.servicetag)
255
- lines.push(`\n### 事業サービス\n${doc.servicetag.replace(/¥\//g, "\n- ").replace(/^/, "- ")}`);
264
+ lines.push(`\n### 事業サービス\n${formatTags(doc.servicetag)}`);
256
265
  if (doc.activtag)
257
- lines.push(`\n### 活動タグ\n${doc.activtag.replace(/¥\//g, "\n- ").replace(/^/, "- ")}`);
266
+ lines.push(`\n### 活動タグ\n${formatTags(doc.activtag)}`);
258
267
  return {
259
268
  content: [{ type: "text", text: lines.join("\n") + usageFooter() }],
260
269
  };
@@ -263,26 +272,28 @@ server.tool("bizgate__marketing_tags", "会社名または法人番号で企業
263
272
  return { content: [{ type: "text", text: errorText(e) }] };
264
273
  }
265
274
  });
266
- // ---------- Tool 4: キーマン検索 ----------
267
- server.tool("bizgate__keyman_search", "会社名または法人番号で人事情報(部署・役職、発表日、発令日)を検索する。最大500件。部署カテゴリやキーワードで絞り込み可能。人名は含まれない。課金なし(企業特定不可・データなしの場合)。", {
275
+ // ---------- Tool 4: キーマン検索(人名付き) ----------
276
+ server.tool("bizgate__keyman_search", "会社名または法人番号で人事情報(担当者名・部署・役職・電話番号・住所)を検索する。部署カテゴリやキーワードで絞り込み可能。デフォルトで上位10名の詳細を取得(limitで変更可能)。API消費: 1回(一覧取得)+ N回(詳細取得、Nはlimit数)。", {
268
277
  shogo: z.string().optional().describe("会社名(例:株式会社○○)"),
269
278
  compno: z.string().optional().describe("法人番号(13桁)"),
270
279
  pList: z.string().optional().describe("都道府県コード(カンマ区切り)"),
271
280
  cList: z.string().optional().describe("部署カテゴリ番号(カンマ区切り。3=人事,13=営業 など)"),
272
- bKwd: z.string().optional().describe("部署・役職キーワード(カンマ区切り。例: 役員,部長,ソリューション)"),
281
+ bKwd: z.string().optional().describe("部署・役職キーワード(カンマ区切り。例: 役員,部長,営業)"),
273
282
  bKOpr: z.string().optional().describe("キーワード結合演算子(0=OR(デフォルト), 1=AND)"),
274
- }, async ({ shogo, compno, pList, cList, bKwd, bKOpr }) => {
283
+ limit: z.number().optional().describe("詳細取得する人数の上限(デフォルト: 10、最大: 50)。API消費に注意。"),
284
+ }, async ({ shogo, compno, pList, cList, bKwd, bKOpr, limit }) => {
275
285
  const err = validateInput(shogo, compno);
276
286
  if (err)
277
287
  return { content: [{ type: "text", text: err }] };
278
- if (!skeyKeyman) {
288
+ if (!skeyKeyman || !skeyKeymanName) {
279
289
  return {
280
- content: [{ type: "text", text: "エラー: BIZGATE_SKEY_KEYMAN が設定されていません。" }],
290
+ content: [{ type: "text", text: "エラー: BIZGATE_SKEY_KEYMAN および BIZGATE_SKEY_KEYMAN_NAME が設定されていません。" }],
281
291
  };
282
292
  }
293
+ const maxLimit = Math.min(limit ?? 10, 50);
283
294
  try {
284
- const { docs, numFound } = await client.searchKeyman({
285
- shogo, compno, pList, cList, bKwd, bKOpr,
295
+ const { docs, totalFound } = await client.searchKeymanWithNames({
296
+ shogo, compno, pList, cList, bKwd, bKOpr, limit: maxLimit,
286
297
  });
287
298
  if (docs.length === 0) {
288
299
  return {
@@ -290,8 +301,24 @@ server.tool("bizgate__keyman_search", "会社名または法人番号で人事
290
301
  };
291
302
  }
292
303
  const companyName = f(docs[0].shogo);
293
- const header = `## 人事情報${companyName ? `: ${companyName}` : ""}(全${numFound}件)\n`;
294
- const text = docs.map((d, i) => formatKeymanDoc(d, i + 1)).join("\n\n");
304
+ const header = `## 人事情報${companyName ? `: ${companyName}` : ""}(全${totalFound}件中、上位${docs.length}件の詳細)\n`;
305
+ const text = docs
306
+ .map((d, i) => {
307
+ const lines = [`${i + 1}. ${f(d.ceo) || "(氏名不明)"}`];
308
+ lines.push(` 役職: ${f(d.bumon) || "(不明)"}`);
309
+ if (f(d.tel))
310
+ lines.push(` 電話: ${f(d.tel)}`);
311
+ if (f(d.add))
312
+ lines.push(` 住所: ${f(d.add)}`);
313
+ if (d.haturei)
314
+ lines.push(` 発令日: ${d.haturei}`);
315
+ if (d.pagedate)
316
+ lines.push(` 発表日: ${d.pagedate}`);
317
+ if (d.bikou)
318
+ lines.push(` 備考: ${d.bikou}`);
319
+ return lines.join("\n");
320
+ })
321
+ .join("\n\n");
295
322
  return {
296
323
  content: [{ type: "text", text: header + text + usageFooter() }],
297
324
  };
package/dist/types.d.ts CHANGED
@@ -4,6 +4,7 @@ export interface BizGateConfig {
4
4
  skeyDepartment: string;
5
5
  skeyMarketing: string;
6
6
  skeyKeyman: string;
7
+ skeyKeymanName: string;
7
8
  authMode: "basic" | "ip";
8
9
  username?: string;
9
10
  password?: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bizgate-mcp-server",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "BizGate APIとClaudeを連携するMCPサーバー",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",