@yinyoudexing/geoc-collect-node-api-mcp 0.1.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/AGENT_SETUP.md +35 -0
- package/README.md +64 -0
- package/dist/client.d.ts +11 -0
- package/dist/client.js +179 -0
- package/dist/client.js.map +1 -0
- package/dist/generated-openapi-tools.d.ts +11124 -0
- package/dist/generated-openapi-tools.js +12849 -0
- package/dist/generated-openapi-tools.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/schema.d.ts +4 -0
- package/dist/schema.js +80 -0
- package/dist/schema.js.map +1 -0
- package/dist/server.d.ts +5 -0
- package/dist/server.js +76 -0
- package/dist/server.js.map +1 -0
- package/dist/tools.d.ts +3 -0
- package/dist/tools.js +12 -0
- package/dist/tools.js.map +1 -0
- package/dist/types.d.ts +48 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +43 -0
package/AGENT_SETUP.md
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Agent 接入说明
|
|
2
|
+
|
|
3
|
+
## Codex
|
|
4
|
+
|
|
5
|
+
发布 npm 包后,在 Codex MCP 配置中使用:
|
|
6
|
+
|
|
7
|
+
```toml
|
|
8
|
+
[mcp_servers.geoc-collect-node-api]
|
|
9
|
+
command = "npx"
|
|
10
|
+
args = ["-y", "@yinyoudexing/geoc-collect-node-api-mcp@0.1.0"]
|
|
11
|
+
|
|
12
|
+
[mcp_servers.geoc-collect-node-api.env]
|
|
13
|
+
GEOC_COLLECT_API_BASE_URL = "http://localhost:6001"
|
|
14
|
+
GEOC_COLLECT_API_TOKEN = "your-token"
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
本地调试未发布版本时,可以使用源码目录:
|
|
18
|
+
|
|
19
|
+
```toml
|
|
20
|
+
[mcp_servers.geoc-collect-node-api]
|
|
21
|
+
command = "node"
|
|
22
|
+
args = ["/absolute/path/to/geoc-collect-node/mcp/geoc-collect-node-api/dist/server.js"]
|
|
23
|
+
|
|
24
|
+
[mcp_servers.geoc-collect-node-api.env]
|
|
25
|
+
GEOC_COLLECT_API_BASE_URL = "http://localhost:6001"
|
|
26
|
+
GEOC_COLLECT_API_TOKEN = "your-token"
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## 使用原则
|
|
30
|
+
|
|
31
|
+
- 查询类工具可以正常调用。
|
|
32
|
+
- 新增、编辑、同步、执行类工具调用前先确认影响范围。
|
|
33
|
+
- 删除、清理、文件上传、二进制下载类接口默认没有暴露成工具。
|
|
34
|
+
- token 使用环境变量传入,不要粘贴到对话或提交中。
|
|
35
|
+
|
package/README.md
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# geoc-collect-node API MCP
|
|
2
|
+
|
|
3
|
+
这是 `geoc-collect-node` 项目的 MCP 服务,按 npm 包方式发布和接入。
|
|
4
|
+
|
|
5
|
+
## 工具来源
|
|
6
|
+
|
|
7
|
+
工具定义从仓库根目录的 `docs/apifox-openapi.json` 生成。生成规则:
|
|
8
|
+
|
|
9
|
+
- 暴露普通 JSON API 为 MCP tools。
|
|
10
|
+
- 跳过 MVT、文件流、导出下载等二进制接口。
|
|
11
|
+
- 跳过 `delete`、`remove`、`abort`、`reset`、`clear` 等删除或清理类接口,避免 Agent 误操作真实数据。
|
|
12
|
+
- 跳过 `multipart/form-data` 文件上传接口;文件上传更适合由业务系统或专门上传工具处理。
|
|
13
|
+
|
|
14
|
+
新增、更新、同步、执行类接口会保留,但 `readOnlyHint` 为 `false`。调用这些工具前应确认参数和影响范围。
|
|
15
|
+
|
|
16
|
+
## 环境变量
|
|
17
|
+
|
|
18
|
+
- `GEOC_COLLECT_API_BASE_URL`:接口服务基础地址,默认 `http://localhost:6001`。
|
|
19
|
+
- `GEOC_COLLECT_API_TOKEN`:鉴权 token。服务会自动补 `Bearer `。
|
|
20
|
+
- `GEOC_COLLECT_API_AUTHORIZATION`:完整 `Authorization` 值;当已包含 `Bearer ` 时会原样使用。
|
|
21
|
+
- `GEOC_COLLECT_API_AK`:可选 `AK` 请求头。
|
|
22
|
+
|
|
23
|
+
## 本地运行
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
npm install
|
|
27
|
+
npm run generate:tools
|
|
28
|
+
npm run build
|
|
29
|
+
GEOC_COLLECT_API_BASE_URL=http://localhost:6001 npm start
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
真实接口调用通常需要在 MCP 客户端配置或启动环境中设置 `GEOC_COLLECT_API_TOKEN`。
|
|
33
|
+
|
|
34
|
+
## 发布为 npm 包
|
|
35
|
+
|
|
36
|
+
发布前确认 `package.json` 中的版本号,并确认当前 npm 账号有发布当前 scope 的权限。
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
cd mcp/geoc-collect-node-api
|
|
40
|
+
npm whoami
|
|
41
|
+
npm test
|
|
42
|
+
npm run build
|
|
43
|
+
npm pack --dry-run
|
|
44
|
+
npm publish --access public
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
当前包名是 `@yinyoudexing/geoc-collect-node-api-mcp`。如果公司使用内网 registry,不要把 registry 写死到包里,优先在本机或 CI 的 `.npmrc` 中配置。
|
|
48
|
+
|
|
49
|
+
## Codex MCP 配置
|
|
50
|
+
|
|
51
|
+
包发布后,使用 `npx` 启动,不依赖本机绝对路径:
|
|
52
|
+
|
|
53
|
+
```toml
|
|
54
|
+
[mcp_servers.geoc-collect-node-api]
|
|
55
|
+
command = "npx"
|
|
56
|
+
args = ["-y", "@yinyoudexing/geoc-collect-node-api-mcp@0.1.0"]
|
|
57
|
+
|
|
58
|
+
[mcp_servers.geoc-collect-node-api.env]
|
|
59
|
+
GEOC_COLLECT_API_BASE_URL = "http://localhost:6001"
|
|
60
|
+
GEOC_COLLECT_API_TOKEN = "your-token"
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
不要在包代码、README、测试或提交中写入真实 token。
|
|
64
|
+
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ApiClientOptions, GeocCollectTool, ToolArguments } from './types.js';
|
|
2
|
+
export declare class GeocCollectApiError extends Error {
|
|
3
|
+
readonly status?: number | undefined;
|
|
4
|
+
readonly responseBody?: unknown | undefined;
|
|
5
|
+
constructor(message: string, status?: number | undefined, responseBody?: unknown | undefined);
|
|
6
|
+
}
|
|
7
|
+
export declare function normalizeBaseUrl(baseUrl: string): string;
|
|
8
|
+
export declare function toAuthorizationHeader(token?: string): string | undefined;
|
|
9
|
+
export declare function createApiClient(options: ApiClientOptions): {
|
|
10
|
+
callTool(tool: GeocCollectTool, args: ToolArguments): Promise<unknown>;
|
|
11
|
+
};
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { zodFromJsonSchema } from './schema.js';
|
|
3
|
+
export class GeocCollectApiError extends Error {
|
|
4
|
+
status;
|
|
5
|
+
responseBody;
|
|
6
|
+
constructor(message, status, responseBody) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.status = status;
|
|
9
|
+
this.responseBody = responseBody;
|
|
10
|
+
this.name = 'GeocCollectApiError';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export function normalizeBaseUrl(baseUrl) {
|
|
14
|
+
const normalized = baseUrl.trim().replace(/\/+$/, '');
|
|
15
|
+
if (!normalized) {
|
|
16
|
+
throw new Error('GEOC_COLLECT_API_BASE_URL is required');
|
|
17
|
+
}
|
|
18
|
+
return normalized;
|
|
19
|
+
}
|
|
20
|
+
export function toAuthorizationHeader(token) {
|
|
21
|
+
if (!token || token.trim() === '')
|
|
22
|
+
return undefined;
|
|
23
|
+
const value = token.trim();
|
|
24
|
+
return /^bearer\s+/i.test(value) ? value : `Bearer ${value}`;
|
|
25
|
+
}
|
|
26
|
+
export function createApiClient(options) {
|
|
27
|
+
const baseUrl = normalizeBaseUrl(options.baseUrl);
|
|
28
|
+
const fetchImpl = options.fetch ?? fetch;
|
|
29
|
+
const authorization = toAuthorizationHeader(options.token);
|
|
30
|
+
const ak = options.ak?.trim();
|
|
31
|
+
return {
|
|
32
|
+
async callTool(tool, args) {
|
|
33
|
+
const inputSchema = tool.zodShape
|
|
34
|
+
? z.object(tool.zodShape)
|
|
35
|
+
: zodFromJsonSchema(tool.inputSchema);
|
|
36
|
+
const parsedArgs = inputSchema.parse(args);
|
|
37
|
+
const { url, requestInit } = buildRequest(baseUrl, authorization, ak, tool, parsedArgs);
|
|
38
|
+
const response = await fetchImpl(url, requestInit);
|
|
39
|
+
const responseBody = await parseResponseBody(response);
|
|
40
|
+
if (!response.ok) {
|
|
41
|
+
throw new GeocCollectApiError(`geoc-collect-node API request failed: ${response.status} ${response.statusText}`, response.status, responseBody);
|
|
42
|
+
}
|
|
43
|
+
return responseBody;
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
function buildRequest(baseUrl, authorization, ak, tool, args) {
|
|
48
|
+
const pathParamNames = new Set(tool.pathParams ?? extractPathParamNames(tool.path));
|
|
49
|
+
const queryParamNames = new Set(tool.queryParams ??
|
|
50
|
+
(tool.method === 'GET' || (tool.method === 'DELETE' && !tool.hasRequestBody)
|
|
51
|
+
? Object.keys(args).filter((key) => !pathParamNames.has(key))
|
|
52
|
+
: []));
|
|
53
|
+
const headerParamNames = new Set(tool.headerParams ?? []);
|
|
54
|
+
const headers = {
|
|
55
|
+
Accept: 'application/json',
|
|
56
|
+
};
|
|
57
|
+
if (authorization)
|
|
58
|
+
headers.Authorization = authorization;
|
|
59
|
+
if (ak)
|
|
60
|
+
headers.AK = ak;
|
|
61
|
+
for (const key of headerParamNames) {
|
|
62
|
+
const value = args[key];
|
|
63
|
+
if (value === undefined || value === null || value === '')
|
|
64
|
+
continue;
|
|
65
|
+
headers[key] = stringifyQueryValue(value);
|
|
66
|
+
}
|
|
67
|
+
const path = buildPath(tool.path, pathParamNames, args);
|
|
68
|
+
const query = new URLSearchParams();
|
|
69
|
+
for (const key of queryParamNames) {
|
|
70
|
+
const value = args[key];
|
|
71
|
+
if (value === undefined || value === null || value === '')
|
|
72
|
+
continue;
|
|
73
|
+
query.set(key, stringifyQueryValue(value));
|
|
74
|
+
}
|
|
75
|
+
const suffix = query.toString() ? `?${query.toString()}` : '';
|
|
76
|
+
const requestInit = {
|
|
77
|
+
method: tool.method,
|
|
78
|
+
headers,
|
|
79
|
+
};
|
|
80
|
+
const inferredBody = tool.method !== 'GET' &&
|
|
81
|
+
Object.keys(args).some((key) => !pathParamNames.has(key) &&
|
|
82
|
+
!queryParamNames.has(key) &&
|
|
83
|
+
!headerParamNames.has(key));
|
|
84
|
+
const shouldSendBody = tool.method !== 'GET' && (tool.hasRequestBody ?? inferredBody);
|
|
85
|
+
if (shouldSendBody) {
|
|
86
|
+
const body = buildBody(tool, pathParamNames, queryParamNames, headerParamNames, args);
|
|
87
|
+
if (tool.bodyContentType === 'application/x-www-form-urlencoded') {
|
|
88
|
+
headers['Content-Type'] = tool.bodyContentType;
|
|
89
|
+
requestInit.body = buildUrlEncodedBody(body);
|
|
90
|
+
}
|
|
91
|
+
else if (tool.bodyContentType === 'multipart/form-data') {
|
|
92
|
+
requestInit.body = buildFormDataBody(body);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
headers['Content-Type'] = 'application/json';
|
|
96
|
+
requestInit.body = JSON.stringify(body);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return {
|
|
100
|
+
url: `${baseUrl}${path}${suffix}`,
|
|
101
|
+
requestInit,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
function buildPath(pathTemplate, pathParamNames, args) {
|
|
105
|
+
let path = pathTemplate;
|
|
106
|
+
for (const name of pathParamNames) {
|
|
107
|
+
const value = args[name];
|
|
108
|
+
if (value === undefined || value === null || value === '') {
|
|
109
|
+
throw new Error(`Missing path parameter: ${name}`);
|
|
110
|
+
}
|
|
111
|
+
path = path.replaceAll(`{${name}}`, encodeURIComponent(stringifyQueryValue(value)));
|
|
112
|
+
}
|
|
113
|
+
return path;
|
|
114
|
+
}
|
|
115
|
+
function buildBody(tool, pathParamNames, queryParamNames, headerParamNames, args) {
|
|
116
|
+
const body = {};
|
|
117
|
+
const bodyParamNames = tool.bodyParams ??
|
|
118
|
+
Object.keys(args).filter((key) => !pathParamNames.has(key) &&
|
|
119
|
+
!queryParamNames.has(key) &&
|
|
120
|
+
!headerParamNames.has(key));
|
|
121
|
+
for (const key of bodyParamNames) {
|
|
122
|
+
const value = args[key];
|
|
123
|
+
if (value !== undefined)
|
|
124
|
+
body[key] = value;
|
|
125
|
+
}
|
|
126
|
+
return body;
|
|
127
|
+
}
|
|
128
|
+
function buildUrlEncodedBody(body) {
|
|
129
|
+
const formBody = new URLSearchParams();
|
|
130
|
+
for (const [key, value] of Object.entries(body)) {
|
|
131
|
+
if (value === undefined || value === null)
|
|
132
|
+
continue;
|
|
133
|
+
formBody.set(key, stringifyQueryValue(value));
|
|
134
|
+
}
|
|
135
|
+
return formBody;
|
|
136
|
+
}
|
|
137
|
+
function buildFormDataBody(body) {
|
|
138
|
+
const formBody = new FormData();
|
|
139
|
+
for (const [key, value] of Object.entries(body)) {
|
|
140
|
+
if (value === undefined || value === null)
|
|
141
|
+
continue;
|
|
142
|
+
if (value instanceof Blob) {
|
|
143
|
+
formBody.set(key, value);
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
formBody.set(key, stringifyQueryValue(value));
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return formBody;
|
|
150
|
+
}
|
|
151
|
+
function extractPathParamNames(pathTemplate) {
|
|
152
|
+
return [...pathTemplate.matchAll(/\{([^}]+)\}/g)].map((match) => match[1]);
|
|
153
|
+
}
|
|
154
|
+
function stringifyQueryValue(value) {
|
|
155
|
+
if (typeof value === 'string')
|
|
156
|
+
return value;
|
|
157
|
+
if (typeof value === 'number' || typeof value === 'boolean')
|
|
158
|
+
return String(value);
|
|
159
|
+
return JSON.stringify(value);
|
|
160
|
+
}
|
|
161
|
+
async function parseResponseBody(response) {
|
|
162
|
+
const text = await response.text();
|
|
163
|
+
if (!text)
|
|
164
|
+
return null;
|
|
165
|
+
const contentType = response.headers.get('content-type') || '';
|
|
166
|
+
if (contentType.includes('application/json')) {
|
|
167
|
+
try {
|
|
168
|
+
return JSON.parse(text);
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
throw new GeocCollectApiError('geoc-collect-node API returned invalid JSON', response.status, {
|
|
172
|
+
text,
|
|
173
|
+
error: error instanceof Error ? error.message : String(error),
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return text;
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|