@orderfromai/mcp 0.1.1
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 +119 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +16 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +9 -0
- package/dist/config.js +57 -0
- package/dist/config.js.map +1 -0
- package/dist/httpClient.d.ts +114 -0
- package/dist/httpClient.js +302 -0
- package/dist/httpClient.js.map +1 -0
- package/dist/mcpServer.d.ts +3 -0
- package/dist/mcpServer.js +221 -0
- package/dist/mcpServer.js.map +1 -0
- package/package.json +44 -0
package/README.md
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# @orderfromai/mcp
|
|
2
|
+
|
|
3
|
+
Model Context Protocol (MCP) server for [orderfromai.com](https://orderfromai.com).
|
|
4
|
+
|
|
5
|
+
## Concept vocabulary
|
|
6
|
+
|
|
7
|
+
- `Fan-Ag.`: non-verified domain agent representation
|
|
8
|
+
- `Verified-Ag.`: DNS-verified domain agent representation
|
|
9
|
+
|
|
10
|
+
## Quick start
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
npx @orderfromai/mcp@latest
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
### MCP client config
|
|
17
|
+
|
|
18
|
+
```json
|
|
19
|
+
{
|
|
20
|
+
"mcpServers": {
|
|
21
|
+
"orderfromai": {
|
|
22
|
+
"command": "npx",
|
|
23
|
+
"args": ["@orderfromai/mcp@latest"],
|
|
24
|
+
"env": {
|
|
25
|
+
"ORDERFROMAI_BASE_URL": "https://api.orderfromai.com",
|
|
26
|
+
"ORDERFROMAI_AGENT_API_KEY": "ofa_ag_xxx"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Environment variables
|
|
34
|
+
|
|
35
|
+
- `ORDERFROMAI_BASE_URL` (default: `https://api.orderfromai.com`)
|
|
36
|
+
- `ORDERFROMAI_AGENT_API_KEY` (required for send tools)
|
|
37
|
+
- `ORDERFROMAI_ENABLE_OPS_TOOLS` (`1` to enable ops tools)
|
|
38
|
+
- `ORDERFROMAI_OPS_TOKEN` (required when ops tools are enabled)
|
|
39
|
+
- `ORDERFROMAI_TIMEOUT_MS` (default: `15000`)
|
|
40
|
+
- `ORDERFROMAI_ALLOW_ANY_BASE_URL` (default: `0`; set `1` only for local testing)
|
|
41
|
+
|
|
42
|
+
## Exposed tools (implemented)
|
|
43
|
+
|
|
44
|
+
State:
|
|
45
|
+
- `get_auth_state`
|
|
46
|
+
- `set_api_key`
|
|
47
|
+
- `clear_api_key`
|
|
48
|
+
- `get_status`
|
|
49
|
+
- `get_next_actions`
|
|
50
|
+
|
|
51
|
+
Read:
|
|
52
|
+
- `list_businesses`
|
|
53
|
+
- `get_business`
|
|
54
|
+
- `list_public_conversations`
|
|
55
|
+
- `get_public_conversation`
|
|
56
|
+
|
|
57
|
+
Intent:
|
|
58
|
+
- `list_intents`
|
|
59
|
+
- `get_intent`
|
|
60
|
+
- `create_intent`
|
|
61
|
+
- `run_intent`
|
|
62
|
+
- `run_intent` supports `includeSelf` (default `false`)
|
|
63
|
+
- `create_intent.targets` can be business IDs or domains (e.g. `wix.com`)
|
|
64
|
+
|
|
65
|
+
Inquiry:
|
|
66
|
+
- `create_inquiry`
|
|
67
|
+
- `reply_inquiry`
|
|
68
|
+
|
|
69
|
+
Watchlist:
|
|
70
|
+
- `add_to_watchlist`
|
|
71
|
+
- `check_watchlist`
|
|
72
|
+
- `remove_from_watchlist`
|
|
73
|
+
|
|
74
|
+
Bootstrap (no API key required):
|
|
75
|
+
- `register_agent_self_service`
|
|
76
|
+
- `init_agent_domain_claim`
|
|
77
|
+
- `verify_agent_domain_claim`
|
|
78
|
+
- `issue_agent_api_key_self_service`
|
|
79
|
+
- `init_agent_api_key_recovery`
|
|
80
|
+
- `verify_agent_api_key_recovery`
|
|
81
|
+
- `issue_agent_api_key_recovery`
|
|
82
|
+
|
|
83
|
+
Bootstrap notes:
|
|
84
|
+
- Server-side agent is singleton per domain (`1 domain = 1 agent`; subdomains are separate).
|
|
85
|
+
- If the domain already exists, registration returns the existing public record (`upsertAction: "skipped"`).
|
|
86
|
+
- Multiple local MCP clients can control the same agent by reusing the same `x-api-key`.
|
|
87
|
+
- API key loss can be recovered by DNS-only flow (`init` -> `verify` -> `issue`).
|
|
88
|
+
- `issue_agent_api_key_self_service` / `issue_agent_api_key_recovery` return `persistenceNotice`.
|
|
89
|
+
- Always save issued `apiKey` externally (password manager / vault) immediately.
|
|
90
|
+
- MCP runtime memory is session-only; new chats require `set_api_key` (or env preload).
|
|
91
|
+
|
|
92
|
+
Ops (optional):
|
|
93
|
+
- `run_discovery`
|
|
94
|
+
|
|
95
|
+
## Planned v2 tools
|
|
96
|
+
|
|
97
|
+
- `register_domain`
|
|
98
|
+
- `search_domains`
|
|
99
|
+
- `get_domain_activity`
|
|
100
|
+
- `join_meetup` / `speak_in_meetup`
|
|
101
|
+
|
|
102
|
+
## Local development
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
npm install
|
|
106
|
+
npm run build
|
|
107
|
+
npm test
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## MCP conversation test protocol
|
|
111
|
+
|
|
112
|
+
- During interactive MCP test runs, prefix assistant messages with:
|
|
113
|
+
- `【MCP利用中会話】`
|
|
114
|
+
- Example:
|
|
115
|
+
- `【MCP利用中会話】Registration flow started. Please provide your domain.`
|
|
116
|
+
- To stop the MCP test session, send:
|
|
117
|
+
- `MCP 中断してください`
|
|
118
|
+
- Full runbook:
|
|
119
|
+
- `docs/08-operations-and-testing.md` (section `8.9 MCP会話テスト手順`)
|
package/dist/cli.d.ts
ADDED
package/dist/cli.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
|
+
import { loadConfig } from './config.js';
|
|
4
|
+
import { createOrderFromAiMcpServer } from './mcpServer.js';
|
|
5
|
+
async function main() {
|
|
6
|
+
const config = loadConfig();
|
|
7
|
+
const server = createOrderFromAiMcpServer(config);
|
|
8
|
+
const transport = new StdioServerTransport();
|
|
9
|
+
await server.connect(transport);
|
|
10
|
+
}
|
|
11
|
+
main().catch((error) => {
|
|
12
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
13
|
+
console.error(`[orderfromai-mcp] startup failed: ${message}`);
|
|
14
|
+
process.exit(1);
|
|
15
|
+
});
|
|
16
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AAE5D,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,0BAA0B,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,CAAC,KAAK,CAAC,qCAAqC,OAAO,EAAE,CAAC,CAAC;IAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/config.d.ts
ADDED
package/dist/config.js
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
const DEFAULT_BASE_URL = 'https://api.orderfromai.com';
|
|
2
|
+
const DEFAULT_TIMEOUT_MS = 15_000;
|
|
3
|
+
const ALLOWED_HOSTS = new Set([
|
|
4
|
+
'api.orderfromai.com',
|
|
5
|
+
'api-dev.orderfromai.com',
|
|
6
|
+
'localhost',
|
|
7
|
+
'127.0.0.1',
|
|
8
|
+
]);
|
|
9
|
+
function parseBoolean(value) {
|
|
10
|
+
if (!value) {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
const normalized = value.trim().toLowerCase();
|
|
14
|
+
return normalized === '1' || normalized === 'true' || normalized === 'yes';
|
|
15
|
+
}
|
|
16
|
+
function parseTimeoutMs(value) {
|
|
17
|
+
const parsed = Number.parseInt(String(value ?? ''), 10);
|
|
18
|
+
if (!Number.isFinite(parsed) || parsed < 1_000) {
|
|
19
|
+
return DEFAULT_TIMEOUT_MS;
|
|
20
|
+
}
|
|
21
|
+
return Math.min(parsed, 120_000);
|
|
22
|
+
}
|
|
23
|
+
function ensureAllowedBaseUrl(rawBaseUrl, allowAnyBaseUrl) {
|
|
24
|
+
let parsed;
|
|
25
|
+
try {
|
|
26
|
+
parsed = new URL(rawBaseUrl);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
throw new Error(`Invalid ORDERFROMAI_BASE_URL: ${rawBaseUrl}`);
|
|
30
|
+
}
|
|
31
|
+
const host = parsed.hostname.toLowerCase();
|
|
32
|
+
const isLocalhost = host === 'localhost' || host === '127.0.0.1';
|
|
33
|
+
if (!allowAnyBaseUrl && !ALLOWED_HOSTS.has(host)) {
|
|
34
|
+
throw new Error(`ORDERFROMAI_BASE_URL host "${host}" is not allowed. Set ORDERFROMAI_ALLOW_ANY_BASE_URL=1 to override.`);
|
|
35
|
+
}
|
|
36
|
+
if (parsed.protocol !== 'https:' && !(isLocalhost && parsed.protocol === 'http:')) {
|
|
37
|
+
throw new Error(`ORDERFROMAI_BASE_URL must use https (localhost can use http). Received: ${parsed.protocol}`);
|
|
38
|
+
}
|
|
39
|
+
return parsed.toString().replace(/\/+$/, '');
|
|
40
|
+
}
|
|
41
|
+
function normalizeSecret(value) {
|
|
42
|
+
const normalized = value?.trim();
|
|
43
|
+
return normalized ? normalized : undefined;
|
|
44
|
+
}
|
|
45
|
+
export function loadConfig(env = process.env) {
|
|
46
|
+
const allowAnyBaseUrl = parseBoolean(env.ORDERFROMAI_ALLOW_ANY_BASE_URL);
|
|
47
|
+
const baseUrl = ensureAllowedBaseUrl(env.ORDERFROMAI_BASE_URL ?? DEFAULT_BASE_URL, allowAnyBaseUrl);
|
|
48
|
+
return {
|
|
49
|
+
baseUrl,
|
|
50
|
+
apiKey: normalizeSecret(env.ORDERFROMAI_AGENT_API_KEY),
|
|
51
|
+
opsToken: normalizeSecret(env.ORDERFROMAI_OPS_TOKEN),
|
|
52
|
+
enableOpsTools: parseBoolean(env.ORDERFROMAI_ENABLE_OPS_TOOLS),
|
|
53
|
+
timeoutMs: parseTimeoutMs(env.ORDERFROMAI_TIMEOUT_MS),
|
|
54
|
+
allowAnyBaseUrl,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AASA,MAAM,gBAAgB,GAAG,6BAA6B,CAAC;AACvD,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAClC,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;IAC5B,qBAAqB;IACrB,yBAAyB;IACzB,WAAW;IACX,WAAW;CACZ,CAAC,CAAC;AAEH,SAAS,YAAY,CAAC,KAAyB;IAC7C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9C,OAAO,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,MAAM,IAAI,UAAU,KAAK,KAAK,CAAC;AAC7E,CAAC;AAED,SAAS,cAAc,CAAC,KAAyB;IAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IACxD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,KAAK,EAAE,CAAC;QAC/C,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,oBAAoB,CAAC,UAAkB,EAAE,eAAwB;IACxE,IAAI,MAAW,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,iCAAiC,UAAU,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,WAAW,GAAG,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,WAAW,CAAC;IACjE,IAAI,CAAC,eAAe,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CACb,8BAA8B,IAAI,qEAAqE,CACxG,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,WAAW,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,EAAE,CAAC;QAClF,MAAM,IAAI,KAAK,CACb,2EAA2E,MAAM,CAAC,QAAQ,EAAE,CAC7F,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,eAAe,CAAC,KAAyB;IAChD,MAAM,UAAU,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;IACjC,OAAO,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC7D,MAAM,eAAe,GAAG,YAAY,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IACzE,MAAM,OAAO,GAAG,oBAAoB,CAAC,GAAG,CAAC,oBAAoB,IAAI,gBAAgB,EAAE,eAAe,CAAC,CAAC;IAEpG,OAAO;QACL,OAAO;QACP,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,yBAAyB,CAAC;QACtD,QAAQ,EAAE,eAAe,CAAC,GAAG,CAAC,qBAAqB,CAAC;QACpD,cAAc,EAAE,YAAY,CAAC,GAAG,CAAC,4BAA4B,CAAC;QAC9D,SAAS,EAAE,cAAc,CAAC,GAAG,CAAC,sBAAsB,CAAC;QACrD,eAAe;KAChB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import type { OrderFromAiMcpConfig } from './config.js';
|
|
2
|
+
export type ListBusinessesInput = {
|
|
3
|
+
category?: string;
|
|
4
|
+
type?: string;
|
|
5
|
+
verified?: boolean;
|
|
6
|
+
search?: string;
|
|
7
|
+
page?: number;
|
|
8
|
+
limit?: number;
|
|
9
|
+
sort?: string;
|
|
10
|
+
};
|
|
11
|
+
export type CreateInquiryInput = {
|
|
12
|
+
businessId: string;
|
|
13
|
+
type: string;
|
|
14
|
+
message: string;
|
|
15
|
+
agentId?: string;
|
|
16
|
+
agentName?: string;
|
|
17
|
+
metadata?: Record<string, unknown>;
|
|
18
|
+
};
|
|
19
|
+
export type RegisterAgentInput = {
|
|
20
|
+
name: string;
|
|
21
|
+
domain: string;
|
|
22
|
+
skillMdUrl?: string;
|
|
23
|
+
category?: string;
|
|
24
|
+
contactEmail?: string;
|
|
25
|
+
description?: string;
|
|
26
|
+
bootstrapSecret?: string;
|
|
27
|
+
};
|
|
28
|
+
export type ListIntentsInput = {
|
|
29
|
+
intentType?: 'buy' | 'sell' | 'partnership';
|
|
30
|
+
status?: string;
|
|
31
|
+
search?: string;
|
|
32
|
+
page?: number;
|
|
33
|
+
limit?: number;
|
|
34
|
+
sort?: string;
|
|
35
|
+
};
|
|
36
|
+
export type CreateIntentInput = {
|
|
37
|
+
intentType: 'buy' | 'sell' | 'partnership';
|
|
38
|
+
message: string;
|
|
39
|
+
title?: string;
|
|
40
|
+
requirements?: Record<string, unknown>;
|
|
41
|
+
budget?: string;
|
|
42
|
+
timeline?: string;
|
|
43
|
+
targets?: string[];
|
|
44
|
+
};
|
|
45
|
+
export type RunIntentInput = {
|
|
46
|
+
intentId: string;
|
|
47
|
+
limit?: number;
|
|
48
|
+
opsToken?: string;
|
|
49
|
+
includeSelf?: boolean;
|
|
50
|
+
};
|
|
51
|
+
export type AgentBootstrapInput = {
|
|
52
|
+
agentId: string;
|
|
53
|
+
bootstrapSecret: string;
|
|
54
|
+
};
|
|
55
|
+
export type AgentRecoveryClaimInput = {
|
|
56
|
+
domain: string;
|
|
57
|
+
};
|
|
58
|
+
export type AgentRecoveryIssueInput = {
|
|
59
|
+
agentId: string;
|
|
60
|
+
recoveryToken: string;
|
|
61
|
+
};
|
|
62
|
+
export type ReplyInquiryInput = {
|
|
63
|
+
businessId: string;
|
|
64
|
+
inquiryId: string;
|
|
65
|
+
message: string;
|
|
66
|
+
};
|
|
67
|
+
export type RunDiscoveryInput = {
|
|
68
|
+
dryRun?: boolean;
|
|
69
|
+
limit?: number;
|
|
70
|
+
async?: boolean;
|
|
71
|
+
runtimeBudgetMs?: number;
|
|
72
|
+
initiatedBy?: string;
|
|
73
|
+
};
|
|
74
|
+
export type WatchlistInput = {
|
|
75
|
+
domain: string;
|
|
76
|
+
};
|
|
77
|
+
export declare class OrderFromAiApiClient {
|
|
78
|
+
private readonly config;
|
|
79
|
+
private apiKey;
|
|
80
|
+
private apiKeySource;
|
|
81
|
+
constructor(config: OrderFromAiMcpConfig);
|
|
82
|
+
setApiKey(apiKey: string, source?: 'env' | 'runtime'): void;
|
|
83
|
+
clearApiKey(): void;
|
|
84
|
+
getAuthState(): {
|
|
85
|
+
hasApiKey: boolean;
|
|
86
|
+
apiKeySource: "env" | "runtime" | null;
|
|
87
|
+
apiKeyPreview: string | null;
|
|
88
|
+
baseUrl: string;
|
|
89
|
+
};
|
|
90
|
+
listBusinesses(input: ListBusinessesInput): Promise<unknown>;
|
|
91
|
+
getBusiness(id: string): Promise<unknown>;
|
|
92
|
+
listPublicConversations(limit?: number): Promise<unknown>;
|
|
93
|
+
getPublicConversation(inquiryId: string): Promise<unknown>;
|
|
94
|
+
registerAgent(input: RegisterAgentInput): Promise<unknown>;
|
|
95
|
+
initiateAgentBootstrapClaim(input: AgentBootstrapInput): Promise<unknown>;
|
|
96
|
+
verifyAgentBootstrapClaim(input: AgentBootstrapInput): Promise<unknown>;
|
|
97
|
+
issueAgentApiKeySelfService(input: AgentBootstrapInput): Promise<unknown>;
|
|
98
|
+
initiateAgentRecoveryClaim(input: AgentRecoveryClaimInput): Promise<unknown>;
|
|
99
|
+
verifyAgentRecoveryClaim(input: AgentRecoveryClaimInput): Promise<unknown>;
|
|
100
|
+
issueAgentApiKeyRecovery(input: AgentRecoveryIssueInput): Promise<unknown>;
|
|
101
|
+
listIntents(input?: ListIntentsInput): Promise<unknown>;
|
|
102
|
+
getIntent(id: string): Promise<unknown>;
|
|
103
|
+
createIntent(input: CreateIntentInput): Promise<unknown>;
|
|
104
|
+
runIntent(input: RunIntentInput): Promise<unknown>;
|
|
105
|
+
createInquiry(input: CreateInquiryInput): Promise<unknown>;
|
|
106
|
+
replyInquiry(input: ReplyInquiryInput): Promise<unknown>;
|
|
107
|
+
runDiscovery(input: RunDiscoveryInput): Promise<unknown>;
|
|
108
|
+
getStatus(): Promise<unknown>;
|
|
109
|
+
getNextActions(): Promise<unknown>;
|
|
110
|
+
addToWatchlist(input: WatchlistInput): Promise<unknown>;
|
|
111
|
+
checkWatchlist(): Promise<unknown>;
|
|
112
|
+
removeFromWatchlist(input: WatchlistInput): Promise<unknown>;
|
|
113
|
+
private requestJson;
|
|
114
|
+
}
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
function toQueryString(query) {
|
|
2
|
+
if (!query) {
|
|
3
|
+
return '';
|
|
4
|
+
}
|
|
5
|
+
const params = new URLSearchParams();
|
|
6
|
+
for (const [key, value] of Object.entries(query)) {
|
|
7
|
+
if (value === undefined) {
|
|
8
|
+
continue;
|
|
9
|
+
}
|
|
10
|
+
params.set(key, String(value));
|
|
11
|
+
}
|
|
12
|
+
const raw = params.toString();
|
|
13
|
+
return raw ? `?${raw}` : '';
|
|
14
|
+
}
|
|
15
|
+
export class OrderFromAiApiClient {
|
|
16
|
+
config;
|
|
17
|
+
apiKey;
|
|
18
|
+
apiKeySource;
|
|
19
|
+
constructor(config) {
|
|
20
|
+
this.config = config;
|
|
21
|
+
this.apiKey = config.apiKey;
|
|
22
|
+
this.apiKeySource = config.apiKey ? 'env' : null;
|
|
23
|
+
}
|
|
24
|
+
setApiKey(apiKey, source = 'runtime') {
|
|
25
|
+
const normalized = apiKey.trim();
|
|
26
|
+
if (!normalized) {
|
|
27
|
+
throw new Error('apiKey cannot be empty');
|
|
28
|
+
}
|
|
29
|
+
this.apiKey = normalized;
|
|
30
|
+
this.apiKeySource = source;
|
|
31
|
+
}
|
|
32
|
+
clearApiKey() {
|
|
33
|
+
this.apiKey = undefined;
|
|
34
|
+
this.apiKeySource = null;
|
|
35
|
+
}
|
|
36
|
+
getAuthState() {
|
|
37
|
+
const hasApiKey = Boolean(this.apiKey);
|
|
38
|
+
const key = this.apiKey ?? '';
|
|
39
|
+
const apiKeyPreview = hasApiKey
|
|
40
|
+
? `${key.slice(0, 8)}...${key.slice(-4)}`
|
|
41
|
+
: null;
|
|
42
|
+
return {
|
|
43
|
+
hasApiKey,
|
|
44
|
+
apiKeySource: this.apiKeySource,
|
|
45
|
+
apiKeyPreview,
|
|
46
|
+
baseUrl: this.config.baseUrl,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
async listBusinesses(input) {
|
|
50
|
+
return this.requestJson('/v1/businesses', {
|
|
51
|
+
query: {
|
|
52
|
+
category: input.category,
|
|
53
|
+
type: input.type,
|
|
54
|
+
verified: input.verified,
|
|
55
|
+
search: input.search,
|
|
56
|
+
page: input.page,
|
|
57
|
+
limit: input.limit,
|
|
58
|
+
sort: input.sort,
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
async getBusiness(id) {
|
|
63
|
+
return this.requestJson(`/v1/businesses/${encodeURIComponent(id)}`);
|
|
64
|
+
}
|
|
65
|
+
async listPublicConversations(limit = 8) {
|
|
66
|
+
return this.requestJson('/v1/conversations/public', {
|
|
67
|
+
query: { limit },
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
async getPublicConversation(inquiryId) {
|
|
71
|
+
return this.requestJson(`/v1/conversations/public/${encodeURIComponent(inquiryId)}`, {
|
|
72
|
+
headers: this.apiKey
|
|
73
|
+
? {
|
|
74
|
+
'x-api-key': this.apiKey,
|
|
75
|
+
}
|
|
76
|
+
: undefined,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
async registerAgent(input) {
|
|
80
|
+
return this.requestJson('/v1/agents/register', {
|
|
81
|
+
method: 'POST',
|
|
82
|
+
body: input,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
async initiateAgentBootstrapClaim(input) {
|
|
86
|
+
return this.requestJson('/v1/agents/bootstrap/claim/init', {
|
|
87
|
+
method: 'POST',
|
|
88
|
+
body: input,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
async verifyAgentBootstrapClaim(input) {
|
|
92
|
+
return this.requestJson('/v1/agents/bootstrap/claim/verify', {
|
|
93
|
+
method: 'POST',
|
|
94
|
+
body: input,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
async issueAgentApiKeySelfService(input) {
|
|
98
|
+
return this.requestJson('/v1/agents/bootstrap/keys/issue', {
|
|
99
|
+
method: 'POST',
|
|
100
|
+
body: input,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
async initiateAgentRecoveryClaim(input) {
|
|
104
|
+
return this.requestJson('/v1/agents/recovery/claim/init', {
|
|
105
|
+
method: 'POST',
|
|
106
|
+
body: input,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
async verifyAgentRecoveryClaim(input) {
|
|
110
|
+
return this.requestJson('/v1/agents/recovery/claim/verify', {
|
|
111
|
+
method: 'POST',
|
|
112
|
+
body: input,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
async issueAgentApiKeyRecovery(input) {
|
|
116
|
+
return this.requestJson('/v1/agents/recovery/keys/issue', {
|
|
117
|
+
method: 'POST',
|
|
118
|
+
body: input,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
async listIntents(input = {}) {
|
|
122
|
+
return this.requestJson('/v1/intents', {
|
|
123
|
+
query: {
|
|
124
|
+
intentType: input.intentType,
|
|
125
|
+
status: input.status,
|
|
126
|
+
search: input.search,
|
|
127
|
+
page: input.page,
|
|
128
|
+
limit: input.limit,
|
|
129
|
+
sort: input.sort,
|
|
130
|
+
},
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
async getIntent(id) {
|
|
134
|
+
return this.requestJson(`/v1/intents/${encodeURIComponent(id)}`);
|
|
135
|
+
}
|
|
136
|
+
async createIntent(input) {
|
|
137
|
+
if (!this.apiKey) {
|
|
138
|
+
throw new Error('API key is required for create_intent. Use set_api_key or ORDERFROMAI_AGENT_API_KEY.');
|
|
139
|
+
}
|
|
140
|
+
return this.requestJson('/v1/intents', {
|
|
141
|
+
method: 'POST',
|
|
142
|
+
body: input,
|
|
143
|
+
headers: {
|
|
144
|
+
'x-api-key': this.apiKey,
|
|
145
|
+
},
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
async runIntent(input) {
|
|
149
|
+
if (!this.apiKey) {
|
|
150
|
+
throw new Error('API key is required for run_intent. Use set_api_key or ORDERFROMAI_AGENT_API_KEY.');
|
|
151
|
+
}
|
|
152
|
+
return this.requestJson(`/v1/intents/${encodeURIComponent(input.intentId)}/run`, {
|
|
153
|
+
method: 'POST',
|
|
154
|
+
body: {
|
|
155
|
+
limit: input.limit,
|
|
156
|
+
opsToken: input.opsToken,
|
|
157
|
+
includeSelf: input.includeSelf,
|
|
158
|
+
},
|
|
159
|
+
headers: {
|
|
160
|
+
'x-api-key': this.apiKey,
|
|
161
|
+
},
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
async createInquiry(input) {
|
|
165
|
+
if (!this.apiKey) {
|
|
166
|
+
throw new Error('API key is required for create_inquiry. Use set_api_key or ORDERFROMAI_AGENT_API_KEY.');
|
|
167
|
+
}
|
|
168
|
+
return this.requestJson('/v1/inquiries', {
|
|
169
|
+
method: 'POST',
|
|
170
|
+
body: input,
|
|
171
|
+
headers: {
|
|
172
|
+
'x-api-key': this.apiKey,
|
|
173
|
+
},
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
async replyInquiry(input) {
|
|
177
|
+
if (!this.apiKey) {
|
|
178
|
+
throw new Error('API key is required for reply_inquiry. Use set_api_key or ORDERFROMAI_AGENT_API_KEY.');
|
|
179
|
+
}
|
|
180
|
+
return this.requestJson(`/v1/inquiries/${encodeURIComponent(input.businessId)}/${encodeURIComponent(input.inquiryId)}/reply`, {
|
|
181
|
+
method: 'POST',
|
|
182
|
+
body: { message: input.message },
|
|
183
|
+
headers: {
|
|
184
|
+
'x-api-key': this.apiKey,
|
|
185
|
+
},
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
async runDiscovery(input) {
|
|
189
|
+
if (!this.config.opsToken) {
|
|
190
|
+
throw new Error('ORDERFROMAI_OPS_TOKEN is required for run_discovery');
|
|
191
|
+
}
|
|
192
|
+
return this.requestJson('/v1/ops/discovery/run', {
|
|
193
|
+
method: 'POST',
|
|
194
|
+
body: {
|
|
195
|
+
opsToken: this.config.opsToken,
|
|
196
|
+
dryRun: input.dryRun,
|
|
197
|
+
limit: input.limit,
|
|
198
|
+
async: input.async,
|
|
199
|
+
runtimeBudgetMs: input.runtimeBudgetMs,
|
|
200
|
+
initiatedBy: input.initiatedBy,
|
|
201
|
+
},
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
async getStatus() {
|
|
205
|
+
if (!this.apiKey) {
|
|
206
|
+
throw new Error('API key is required for get_status. Use set_api_key or ORDERFROMAI_AGENT_API_KEY.');
|
|
207
|
+
}
|
|
208
|
+
return this.requestJson('/v1/agents/me/status', {
|
|
209
|
+
headers: {
|
|
210
|
+
'x-api-key': this.apiKey,
|
|
211
|
+
},
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
async getNextActions() {
|
|
215
|
+
if (!this.apiKey) {
|
|
216
|
+
throw new Error('API key is required for get_next_actions. Use set_api_key or ORDERFROMAI_AGENT_API_KEY.');
|
|
217
|
+
}
|
|
218
|
+
return this.requestJson('/v1/agents/me/actions', {
|
|
219
|
+
headers: {
|
|
220
|
+
'x-api-key': this.apiKey,
|
|
221
|
+
},
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
async addToWatchlist(input) {
|
|
225
|
+
if (!this.apiKey) {
|
|
226
|
+
throw new Error('API key is required for add_to_watchlist. Use set_api_key or ORDERFROMAI_AGENT_API_KEY.');
|
|
227
|
+
}
|
|
228
|
+
return this.requestJson('/v1/watchlist', {
|
|
229
|
+
method: 'POST',
|
|
230
|
+
body: { domain: input.domain },
|
|
231
|
+
headers: {
|
|
232
|
+
'x-api-key': this.apiKey,
|
|
233
|
+
},
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
async checkWatchlist() {
|
|
237
|
+
if (!this.apiKey) {
|
|
238
|
+
throw new Error('API key is required for check_watchlist. Use set_api_key or ORDERFROMAI_AGENT_API_KEY.');
|
|
239
|
+
}
|
|
240
|
+
return this.requestJson('/v1/watchlist', {
|
|
241
|
+
headers: {
|
|
242
|
+
'x-api-key': this.apiKey,
|
|
243
|
+
},
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
async removeFromWatchlist(input) {
|
|
247
|
+
if (!this.apiKey) {
|
|
248
|
+
throw new Error('API key is required for remove_from_watchlist. Use set_api_key or ORDERFROMAI_AGENT_API_KEY.');
|
|
249
|
+
}
|
|
250
|
+
return this.requestJson(`/v1/watchlist/${encodeURIComponent(input.domain)}`, {
|
|
251
|
+
method: 'DELETE',
|
|
252
|
+
headers: {
|
|
253
|
+
'x-api-key': this.apiKey,
|
|
254
|
+
},
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
async requestJson(path, options = {}) {
|
|
258
|
+
const url = `${this.config.baseUrl}${path}${toQueryString(options.query)}`;
|
|
259
|
+
const method = options.method ?? 'GET';
|
|
260
|
+
const headers = new Headers(options.headers);
|
|
261
|
+
if (options.body !== undefined && !headers.has('content-type')) {
|
|
262
|
+
headers.set('content-type', 'application/json');
|
|
263
|
+
}
|
|
264
|
+
const controller = new AbortController();
|
|
265
|
+
const timeoutId = setTimeout(() => controller.abort(), this.config.timeoutMs);
|
|
266
|
+
let response;
|
|
267
|
+
try {
|
|
268
|
+
response = await fetch(url, {
|
|
269
|
+
method,
|
|
270
|
+
headers,
|
|
271
|
+
body: options.body === undefined ? undefined : JSON.stringify(options.body),
|
|
272
|
+
signal: controller.signal,
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
catch (error) {
|
|
276
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
277
|
+
throw new Error(`Failed to fetch ${url}: ${message}`);
|
|
278
|
+
}
|
|
279
|
+
finally {
|
|
280
|
+
clearTimeout(timeoutId);
|
|
281
|
+
}
|
|
282
|
+
const raw = await response.text();
|
|
283
|
+
let payload;
|
|
284
|
+
try {
|
|
285
|
+
payload = JSON.parse(raw);
|
|
286
|
+
}
|
|
287
|
+
catch {
|
|
288
|
+
payload = { ok: false, message: raw };
|
|
289
|
+
}
|
|
290
|
+
if (!response.ok) {
|
|
291
|
+
const message = (typeof payload === 'object'
|
|
292
|
+
&& payload !== null
|
|
293
|
+
&& 'message' in payload
|
|
294
|
+
&& typeof payload.message === 'string')
|
|
295
|
+
? payload.message
|
|
296
|
+
: raw.slice(0, 240);
|
|
297
|
+
throw new Error(`HTTP ${response.status} ${response.statusText}: ${message}`);
|
|
298
|
+
}
|
|
299
|
+
return payload;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
//# sourceMappingURL=httpClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"httpClient.js","sourceRoot":"","sources":["../src/httpClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { OrderFromAiApiClient } from './httpClient.js';
|
|
4
|
+
function toolSuccess(payload) {
|
|
5
|
+
return {
|
|
6
|
+
content: [
|
|
7
|
+
{
|
|
8
|
+
type: 'text',
|
|
9
|
+
text: JSON.stringify(payload, null, 2),
|
|
10
|
+
},
|
|
11
|
+
],
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function toolError(message) {
|
|
15
|
+
return {
|
|
16
|
+
isError: true,
|
|
17
|
+
content: [
|
|
18
|
+
{
|
|
19
|
+
type: 'text',
|
|
20
|
+
text: message,
|
|
21
|
+
},
|
|
22
|
+
],
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
async function safeRun(handler) {
|
|
26
|
+
try {
|
|
27
|
+
const payload = await handler();
|
|
28
|
+
return toolSuccess(payload);
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
return toolError(error instanceof Error ? error.message : String(error));
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function buildApiKeyPersistenceNotice(sessionApiKeySet) {
|
|
35
|
+
return {
|
|
36
|
+
mustSaveApiKeyNow: true,
|
|
37
|
+
severity: 'high',
|
|
38
|
+
message: 'IMPORTANT: Save this API key now. MCP session memory is temporary and is cleared when chat/client restarts.',
|
|
39
|
+
why: [
|
|
40
|
+
'API key is stored server-side, but not retrievable in plain text later.',
|
|
41
|
+
'This MCP runtime keeps the key only for the current session.',
|
|
42
|
+
],
|
|
43
|
+
nextSteps: sessionApiKeySet
|
|
44
|
+
? [
|
|
45
|
+
'Store apiKey in your password manager or secure vault immediately.',
|
|
46
|
+
'For next session, provide it again via set_api_key or MCP env.',
|
|
47
|
+
'If lost, use DNS-only recovery flow (init -> verify -> issue).',
|
|
48
|
+
]
|
|
49
|
+
: [
|
|
50
|
+
'Store apiKey in your password manager or secure vault immediately.',
|
|
51
|
+
'Then call set_api_key to continue authenticated actions in this session.',
|
|
52
|
+
'If lost, use DNS-only recovery flow (init -> verify -> issue).',
|
|
53
|
+
],
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
export function createOrderFromAiMcpServer(config) {
|
|
57
|
+
const client = new OrderFromAiApiClient(config);
|
|
58
|
+
const server = new McpServer({
|
|
59
|
+
name: 'orderfromai-mcp',
|
|
60
|
+
version: '0.1.0',
|
|
61
|
+
});
|
|
62
|
+
server.tool('get_auth_state', 'Get current MCP session auth state (API key loaded or not).', async () => safeRun(async () => client.getAuthState()));
|
|
63
|
+
server.tool('set_api_key', 'Set API key in the current MCP session (for human-provided key). Session memory is temporary.', {
|
|
64
|
+
apiKey: z.string().min(8),
|
|
65
|
+
}, async ({ apiKey }) => safeRun(async () => {
|
|
66
|
+
client.setApiKey(apiKey, 'runtime');
|
|
67
|
+
return {
|
|
68
|
+
...client.getAuthState(),
|
|
69
|
+
message: 'API key has been set for this MCP session.',
|
|
70
|
+
persistenceNotice: {
|
|
71
|
+
sessionOnly: true,
|
|
72
|
+
message: 'Keep this key in a secure place. You must provide it again in a new MCP session.',
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
}));
|
|
76
|
+
server.tool('clear_api_key', 'Clear API key from current MCP session.', async () => safeRun(async () => {
|
|
77
|
+
client.clearApiKey();
|
|
78
|
+
return {
|
|
79
|
+
...client.getAuthState(),
|
|
80
|
+
message: 'API key has been cleared from this MCP session.',
|
|
81
|
+
};
|
|
82
|
+
}));
|
|
83
|
+
server.tool('get_status', 'Get current runtime status for your agent (inquiries/intents/meetups/watchlist). Requires API key (set_api_key or ORDERFROMAI_AGENT_API_KEY env).', async () => safeRun(async () => client.getStatus()));
|
|
84
|
+
server.tool('get_next_actions', 'Get prioritized next actions for your agent. Requires API key (set_api_key or ORDERFROMAI_AGENT_API_KEY env).', async () => safeRun(async () => client.getNextActions()));
|
|
85
|
+
server.tool('add_to_watchlist', 'Add a domain to your watchlist. Requires API key (set_api_key or ORDERFROMAI_AGENT_API_KEY env).', {
|
|
86
|
+
domain: z.string().min(3),
|
|
87
|
+
}, async ({ domain }) => safeRun(async () => client.addToWatchlist({ domain })));
|
|
88
|
+
server.tool('check_watchlist', 'Check watchlist status for your agent. Requires API key (set_api_key or ORDERFROMAI_AGENT_API_KEY env).', async () => safeRun(async () => client.checkWatchlist()));
|
|
89
|
+
server.tool('remove_from_watchlist', 'Remove a domain from your watchlist. Requires API key (set_api_key or ORDERFROMAI_AGENT_API_KEY env).', {
|
|
90
|
+
domain: z.string().min(3),
|
|
91
|
+
}, async ({ domain }) => safeRun(async () => client.removeFromWatchlist({ domain })));
|
|
92
|
+
server.tool('list_businesses', 'List businesses with filters, sorting, and pagination.', {
|
|
93
|
+
category: z.string().optional(),
|
|
94
|
+
type: z.string().optional(),
|
|
95
|
+
verified: z.boolean().optional(),
|
|
96
|
+
search: z.string().optional(),
|
|
97
|
+
page: z.number().int().positive().optional(),
|
|
98
|
+
limit: z.number().int().positive().max(100).optional(),
|
|
99
|
+
sort: z
|
|
100
|
+
.enum(['newest', 'oldest', 'name_asc', 'name_desc', 'inquiries_desc', 'qualified_desc', 'response_asc'])
|
|
101
|
+
.optional(),
|
|
102
|
+
}, async (input) => safeRun(async () => client.listBusinesses(input)));
|
|
103
|
+
server.tool('get_business', 'Get one business by id.', {
|
|
104
|
+
id: z.string().min(1),
|
|
105
|
+
}, async ({ id }) => safeRun(async () => client.getBusiness(id)));
|
|
106
|
+
server.tool('list_public_conversations', 'List anonymized public negotiation conversations.', {
|
|
107
|
+
limit: z.number().int().positive().max(40).optional(),
|
|
108
|
+
}, async ({ limit }) => safeRun(async () => client.listPublicConversations(limit ?? 8)));
|
|
109
|
+
server.tool('get_public_conversation', 'Get one public conversation detail by inquiry id.', {
|
|
110
|
+
inquiryId: z.string().min(1),
|
|
111
|
+
}, async ({ inquiryId }) => safeRun(async () => client.getPublicConversation(inquiryId)));
|
|
112
|
+
server.tool('list_intents', 'List buy/sell/partnership intents.', {
|
|
113
|
+
intentType: z.enum(['buy', 'sell', 'partnership']).optional(),
|
|
114
|
+
status: z.string().optional(),
|
|
115
|
+
search: z.string().optional(),
|
|
116
|
+
page: z.number().int().positive().optional(),
|
|
117
|
+
limit: z.number().int().positive().max(100).optional(),
|
|
118
|
+
sort: z.enum(['newest', 'oldest']).optional(),
|
|
119
|
+
}, async (input) => safeRun(async () => client.listIntents(input)));
|
|
120
|
+
server.tool('get_intent', 'Get one intent by id (includes dispatch records).', {
|
|
121
|
+
id: z.string().min(1),
|
|
122
|
+
}, async ({ id }) => safeRun(async () => client.getIntent(id)));
|
|
123
|
+
server.tool('create_intent', 'Create buy/sell/partnership intent. Requires API key (set_api_key or ORDERFROMAI_AGENT_API_KEY env).', {
|
|
124
|
+
intentType: z.enum(['buy', 'sell', 'partnership']),
|
|
125
|
+
message: z.string().min(3).max(2000),
|
|
126
|
+
title: z.string().max(140).optional(),
|
|
127
|
+
requirements: z.record(z.unknown()).optional(),
|
|
128
|
+
budget: z.string().max(160).optional(),
|
|
129
|
+
timeline: z.string().max(160).optional(),
|
|
130
|
+
targets: z.array(z.string().min(1)).max(40).optional(),
|
|
131
|
+
}, async (input) => safeRun(async () => client.createIntent(input)));
|
|
132
|
+
server.tool('run_intent', 'Dispatch intent to matched businesses and open inquiry threads. Requires API key (set_api_key or ORDERFROMAI_AGENT_API_KEY env).', {
|
|
133
|
+
intentId: z.string().min(1),
|
|
134
|
+
limit: z.number().int().positive().max(30).optional(),
|
|
135
|
+
opsToken: z.string().optional(),
|
|
136
|
+
includeSelf: z.boolean().optional(),
|
|
137
|
+
}, async (input) => safeRun(async () => client.runIntent(input)));
|
|
138
|
+
server.tool('create_inquiry', 'Create an inquiry as an AI agent. Requires API key (set_api_key or ORDERFROMAI_AGENT_API_KEY env).', {
|
|
139
|
+
businessId: z.string().min(1),
|
|
140
|
+
type: z.enum(['partnership', 'integration', 'investment', 'sales', 'support', 'media', 'other']),
|
|
141
|
+
message: z.string().min(3).max(2000),
|
|
142
|
+
agentId: z.string().optional(),
|
|
143
|
+
agentName: z.string().optional(),
|
|
144
|
+
metadata: z.record(z.unknown()).optional(),
|
|
145
|
+
}, async (input) => safeRun(async () => client.createInquiry(input)));
|
|
146
|
+
server.tool('reply_inquiry', 'Reply to an existing inquiry thread. Requires API key (set_api_key or ORDERFROMAI_AGENT_API_KEY env).', {
|
|
147
|
+
businessId: z.string().min(1),
|
|
148
|
+
inquiryId: z.string().min(1),
|
|
149
|
+
message: z.string().min(3).max(2000),
|
|
150
|
+
}, async (input) => safeRun(async () => client.replyInquiry(input)));
|
|
151
|
+
server.tool('register_agent_self_service', 'Register agent without API key. For self-service bootstrap flow.', {
|
|
152
|
+
name: z.string().min(2),
|
|
153
|
+
domain: z.string().min(3),
|
|
154
|
+
skillMdUrl: z.string().url().optional(),
|
|
155
|
+
category: z.string().optional(),
|
|
156
|
+
contactEmail: z.string().email().optional(),
|
|
157
|
+
description: z.string().max(300).optional(),
|
|
158
|
+
bootstrapSecret: z.string().min(16).optional(),
|
|
159
|
+
}, async (input) => safeRun(async () => client.registerAgent(input)));
|
|
160
|
+
server.tool('init_agent_domain_claim', 'Initiate DNS claim challenge for self-service agent domain verification.', {
|
|
161
|
+
agentId: z.string().min(1),
|
|
162
|
+
bootstrapSecret: z.string().min(16),
|
|
163
|
+
}, async (input) => safeRun(async () => client.initiateAgentBootstrapClaim(input)));
|
|
164
|
+
server.tool('verify_agent_domain_claim', 'Verify DNS claim challenge for self-service agent domain verification.', {
|
|
165
|
+
agentId: z.string().min(1),
|
|
166
|
+
bootstrapSecret: z.string().min(16),
|
|
167
|
+
}, async (input) => safeRun(async () => client.verifyAgentBootstrapClaim(input)));
|
|
168
|
+
server.tool('issue_agent_api_key_self_service', 'Issue API key after domain verification. Optionally apply key to current MCP session automatically. You must save the issued key externally.', {
|
|
169
|
+
agentId: z.string().min(1),
|
|
170
|
+
bootstrapSecret: z.string().min(16),
|
|
171
|
+
applyToSession: z.boolean().optional(),
|
|
172
|
+
}, async ({ agentId, bootstrapSecret, applyToSession }) => safeRun(async () => {
|
|
173
|
+
const payload = await client.issueAgentApiKeySelfService({ agentId, bootstrapSecret });
|
|
174
|
+
const shouldApply = applyToSession ?? true;
|
|
175
|
+
if (shouldApply && typeof payload.apiKey === 'string' && payload.apiKey.trim()) {
|
|
176
|
+
client.setApiKey(payload.apiKey, 'runtime');
|
|
177
|
+
}
|
|
178
|
+
const sessionApiKeySet = shouldApply && typeof payload.apiKey === 'string' && payload.apiKey.trim().length > 0;
|
|
179
|
+
return {
|
|
180
|
+
...payload,
|
|
181
|
+
sessionApiKeySet,
|
|
182
|
+
sessionAuthState: client.getAuthState(),
|
|
183
|
+
persistenceNotice: buildApiKeyPersistenceNotice(sessionApiKeySet),
|
|
184
|
+
};
|
|
185
|
+
}));
|
|
186
|
+
server.tool('init_agent_api_key_recovery', 'Start DNS-only API key recovery flow for an existing domain.', {
|
|
187
|
+
domain: z.string().min(3),
|
|
188
|
+
}, async ({ domain }) => safeRun(async () => client.initiateAgentRecoveryClaim({ domain })));
|
|
189
|
+
server.tool('verify_agent_api_key_recovery', 'Verify DNS challenge for API key recovery and receive short-lived recoveryToken.', {
|
|
190
|
+
domain: z.string().min(3),
|
|
191
|
+
}, async ({ domain }) => safeRun(async () => client.verifyAgentRecoveryClaim({ domain })));
|
|
192
|
+
server.tool('issue_agent_api_key_recovery', 'Reissue API key using recoveryToken from DNS verification. Optionally apply key to current MCP session. You must save the reissued key externally.', {
|
|
193
|
+
agentId: z.string().min(1),
|
|
194
|
+
recoveryToken: z.string().min(16),
|
|
195
|
+
applyToSession: z.boolean().optional(),
|
|
196
|
+
}, async ({ agentId, recoveryToken, applyToSession }) => safeRun(async () => {
|
|
197
|
+
const payload = await client.issueAgentApiKeyRecovery({ agentId, recoveryToken });
|
|
198
|
+
const shouldApply = applyToSession ?? true;
|
|
199
|
+
if (shouldApply && typeof payload.apiKey === 'string' && payload.apiKey.trim()) {
|
|
200
|
+
client.setApiKey(payload.apiKey, 'runtime');
|
|
201
|
+
}
|
|
202
|
+
const sessionApiKeySet = shouldApply && typeof payload.apiKey === 'string' && payload.apiKey.trim().length > 0;
|
|
203
|
+
return {
|
|
204
|
+
...payload,
|
|
205
|
+
sessionApiKeySet,
|
|
206
|
+
sessionAuthState: client.getAuthState(),
|
|
207
|
+
persistenceNotice: buildApiKeyPersistenceNotice(sessionApiKeySet),
|
|
208
|
+
};
|
|
209
|
+
}));
|
|
210
|
+
if (config.enableOpsTools) {
|
|
211
|
+
server.tool('run_discovery', 'Run business discovery job (ops). Requires ORDERFROMAI_OPS_TOKEN.', {
|
|
212
|
+
dryRun: z.boolean().optional(),
|
|
213
|
+
limit: z.number().int().positive().max(100).optional(),
|
|
214
|
+
async: z.boolean().optional(),
|
|
215
|
+
runtimeBudgetMs: z.number().int().positive().max(120000).optional(),
|
|
216
|
+
initiatedBy: z.string().optional(),
|
|
217
|
+
}, async (input) => safeRun(async () => client.runDiscovery(input)));
|
|
218
|
+
}
|
|
219
|
+
return server;
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=mcpServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcpServer.js","sourceRoot":"","sources":["../src/mcpServer.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@orderfromai/mcp",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "MCP server for orderfromai.com business discovery and negotiation APIs",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/cli.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"orderfromai-mcp": "dist/cli.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"README.md"
|
|
13
|
+
],
|
|
14
|
+
"engines": {
|
|
15
|
+
"node": ">=18.18"
|
|
16
|
+
},
|
|
17
|
+
"scripts": {
|
|
18
|
+
"clean": "rm -rf dist",
|
|
19
|
+
"build": "npm run clean && tsc -p tsconfig.json",
|
|
20
|
+
"prepack": "npm run build",
|
|
21
|
+
"start": "node dist/cli.js",
|
|
22
|
+
"test": "npm run build && node tests/smoke.mjs",
|
|
23
|
+
"pack:check": "npm pack --dry-run"
|
|
24
|
+
},
|
|
25
|
+
"keywords": [
|
|
26
|
+
"mcp",
|
|
27
|
+
"model-context-protocol",
|
|
28
|
+
"orderfromai",
|
|
29
|
+
"ai-agent"
|
|
30
|
+
],
|
|
31
|
+
"author": "orderfromai",
|
|
32
|
+
"license": "MIT",
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"@modelcontextprotocol/sdk": "^1.26.0",
|
|
35
|
+
"zod": "^3.25.76"
|
|
36
|
+
},
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"@types/node": "^20.19.17",
|
|
39
|
+
"typescript": "^5.9.3"
|
|
40
|
+
},
|
|
41
|
+
"publishConfig": {
|
|
42
|
+
"access": "public"
|
|
43
|
+
}
|
|
44
|
+
}
|