@agentmanifest/mcp-server 0.1.4 → 0.1.5

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
@@ -66,6 +66,14 @@ Validates JSON against the official AMP schema for `agentmanifest-0.2` or `agent
66
66
  - `valid: true` → `success_token` like `amp-schema-valid:agentmanifest-0.3:My API`
67
67
  - `valid: false` → `errors[]` with AJV paths/messages
68
68
 
69
+ ### `submit_api_to_amp_registry`
70
+
71
+ Submits an API origin to the public AMP registry (`POST https://api.agent-manifest.com/listings/submit`) after the manifest is live. Same outcome as `amp publish`.
72
+
73
+ ### `check_amp_submission_status`
74
+
75
+ Polls `GET /listings/submit/{submission_id}/status` for validation and listing progress.
76
+
69
77
  ### `check_agent_permissions`
70
78
 
71
79
  Checks an intended HTTP operation against a manifest’s declared endpoints and constraints.
@@ -162,19 +170,23 @@ After publishing to npm, replace with:
162
170
 
163
171
  ## Cursor
164
172
 
165
- **Settings → MCP → Add server → Command:**
173
+ Open the **AMP** workspace — [`.cursor/mcp.json`](../../.cursor/mcp.json) registers **agent-manifest-protocol** (npm) and **agent-manifest-protocol-local** (monorepo). Enable them under **Settings → MCP**, then reload the window.
166
174
 
167
- - Command: `node`
168
- - Args: `/path/to/amp-mcp/dist/index.js`
175
+ Full walkthrough: **[TRY-IT.md](./TRY-IT.md)**.
169
176
 
170
- Or use `npx -y @agentmanifest/mcp-server` once published.
177
+ ```bash
178
+ npm run smoke:mcp # terminal proof: lists tools + fetches BakeBase manifest
179
+ ```
171
180
 
172
181
  ## Smithery
173
182
 
174
- This repo includes [`smithery.yaml`](./smithery.yaml) for one-command Smithery installs. Point Smithery at this package directory or published GitHub repo; optional env:
183
+ See **[SMITHERY.md](./SMITHERY.md)**. After `npx smithery@latest auth login`:
184
+
185
+ ```bash
186
+ npm run smithery:publish
187
+ ```
175
188
 
176
- - `AMP_FETCH_TIMEOUT_MS`
177
- - `AMP_VALIDATOR_URL` (reserved for future remote validation helpers)
189
+ [`smithery.yaml`](./smithery.yaml) drives `mcp-bundler`; optional config: `AMP_FETCH_TIMEOUT_MS`, `AMP_VALIDATOR_URL`.
178
190
 
179
191
  ## Registries (official MCP Registry, Smithery, npm)
180
192
 
@@ -0,0 +1,10 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" role="img" aria-label="Agent Manifest Protocol">
2
+ <rect width="512" height="512" rx="96" fill="#0f766e"/>
3
+ <rect x="96" y="120" width="320" height="272" rx="24" fill="#fafaf9"/>
4
+ <rect x="136" y="168" width="200" height="16" rx="8" fill="#0f766e"/>
5
+ <rect x="136" y="208" width="240" height="12" rx="6" fill="#d6d3d1"/>
6
+ <rect x="136" y="236" width="220" height="12" rx="6" fill="#d6d3d1"/>
7
+ <rect x="136" y="264" width="180" height="12" rx="6" fill="#d6d3d1"/>
8
+ <circle cx="360" cy="320" r="40" fill="#14b8a6"/>
9
+ <path d="M344 320 L356 332 L376 304" stroke="#fafaf9" stroke-width="10" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
10
+ </svg>
Binary file
@@ -1 +1 @@
1
- {"version":3,"file":"create-server.d.ts","sourceRoot":"","sources":["../src/create-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAWpE,wBAAgB,kBAAkB,IAAI,SAAS,CAiH9C"}
1
+ {"version":3,"file":"create-server.d.ts","sourceRoot":"","sources":["../src/create-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAuBpE,wBAAgB,kBAAkB,IAAI,SAAS,CAwK9C"}
@@ -3,25 +3,33 @@ import * as z from 'zod';
3
3
  import { fetchManifestByDomain } from './lib/fetch-manifest.js';
4
4
  import { validateManifestSyntax } from './lib/validate-syntax.js';
5
5
  import { checkAgentPermissions } from './lib/check-permissions.js';
6
- const manifestObjectSchema = z
7
- .record(z.unknown())
8
- .describe('Parsed AMP manifest object (agentmanifest-0.2 or agentmanifest-0.3).');
6
+ import { getAmpSubmissionStatus, submitApiToAmpRegistry } from './lib/submit-listing.js';
7
+ import { manifestObjectSchema, fetchManifestOutputSchema, validateSyntaxOutputSchema, submitListingOutputSchema, submissionStatusOutputSchema, checkPermissionsOutputSchema, SMITHERY_TOOL_CARDS, } from './tool-catalog.js';
8
+ const toolMeta = (name) => {
9
+ const card = SMITHERY_TOOL_CARDS.find((t) => t.name === name);
10
+ if (!card)
11
+ throw new Error(`Missing tool catalog entry: ${name}`);
12
+ return card;
13
+ };
9
14
  export function createAmpMcpServer() {
10
15
  const server = new McpServer({
11
16
  name: 'agent-manifest-protocol',
12
- version: '0.1.0',
17
+ version: '0.1.5',
13
18
  }, {
14
19
  instructions: [
15
20
  'You are connected to the official Agent Manifest Protocol (AMP) MCP server.',
16
21
  'Use fetch_manifest_by_domain to discover /.well-known/agent-manifest.json (and fallbacks) for any API origin.',
17
22
  'Use validate_manifest_syntax before trusting manifest JSON.',
18
23
  'Use check_agent_permissions before calling an API operation to see if it matches declared endpoints, auth, payment, and agent_notes constraints.',
24
+ 'After validation, use submit_api_to_amp_registry then check_amp_submission_status to list the API on the public AMP registry (same flow as amp publish / POST /listings/submit).',
19
25
  'AMP complements MCP: MCP carries tools; AMP declares what remote agents/APIs allow, cost, and how to authenticate.',
20
26
  ].join(' '),
21
27
  });
22
28
  server.registerTool('fetch_manifest_by_domain', {
23
- title: 'Fetch AMP manifest by domain',
24
- description: 'Resolve an API origin from a domain (e.g. "bakebase.agent-manifest.com"), try standard AMP discovery URLs, and return parsed manifest JSON plus metadata.',
29
+ title: toolMeta('fetch_manifest_by_domain').title,
30
+ description: toolMeta('fetch_manifest_by_domain').description,
31
+ annotations: toolMeta('fetch_manifest_by_domain').annotations,
32
+ outputSchema: fetchManifestOutputSchema,
25
33
  inputSchema: {
26
34
  domain: z
27
35
  .string()
@@ -31,6 +39,7 @@ export function createAmpMcpServer() {
31
39
  }, async ({ domain }) => {
32
40
  const result = await fetchManifestByDomain(domain);
33
41
  return {
42
+ structuredContent: result,
34
43
  content: [
35
44
  {
36
45
  type: 'text',
@@ -40,8 +49,10 @@ export function createAmpMcpServer() {
40
49
  };
41
50
  });
42
51
  server.registerTool('validate_manifest_syntax', {
43
- title: 'Validate AMP manifest JSON Schema',
44
- description: 'Validate a manifest JSON string or object against the official AMP JSON Schema for its spec_version (agentmanifest-0.2 or agentmanifest-0.3). Returns errors or a success_token.',
52
+ title: toolMeta('validate_manifest_syntax').title,
53
+ description: toolMeta('validate_manifest_syntax').description,
54
+ annotations: toolMeta('validate_manifest_syntax').annotations,
55
+ outputSchema: validateSyntaxOutputSchema,
45
56
  inputSchema: {
46
57
  manifest: z
47
58
  .union([z.string(), manifestObjectSchema])
@@ -50,6 +61,7 @@ export function createAmpMcpServer() {
50
61
  }, async ({ manifest }) => {
51
62
  const result = validateManifestSyntax(manifest);
52
63
  return {
64
+ structuredContent: result,
53
65
  content: [
54
66
  {
55
67
  type: 'text',
@@ -59,8 +71,10 @@ export function createAmpMcpServer() {
59
71
  };
60
72
  });
61
73
  server.registerTool('check_agent_permissions', {
62
- title: 'Check action against AMP manifest constraints',
63
- description: 'Given an intended HTTP action (method + path or full URL) and a manifest, determine whether the action aligns with declared endpoints, authentication, payment onboarding, rate limits, and language in agent_notes.',
74
+ title: toolMeta('check_agent_permissions').title,
75
+ description: toolMeta('check_agent_permissions').description,
76
+ annotations: toolMeta('check_agent_permissions').annotations,
77
+ outputSchema: checkPermissionsOutputSchema,
64
78
  inputSchema: {
65
79
  action: z
66
80
  .string()
@@ -82,6 +96,7 @@ export function createAmpMcpServer() {
82
96
  payment_onboarded,
83
97
  });
84
98
  return {
99
+ structuredContent: result,
85
100
  content: [
86
101
  {
87
102
  type: 'text',
@@ -90,6 +105,42 @@ export function createAmpMcpServer() {
90
105
  ],
91
106
  };
92
107
  });
108
+ server.registerTool('submit_api_to_amp_registry', {
109
+ title: toolMeta('submit_api_to_amp_registry').title,
110
+ description: toolMeta('submit_api_to_amp_registry').description,
111
+ annotations: toolMeta('submit_api_to_amp_registry').annotations,
112
+ outputSchema: submitListingOutputSchema,
113
+ inputSchema: {
114
+ api_url: z
115
+ .string()
116
+ .min(1)
117
+ .describe('HTTPS API origin where /.well-known/agent-manifest.json is served, e.g. "https://bakebase.agent-manifest.com".'),
118
+ },
119
+ }, async ({ api_url }) => {
120
+ const result = await submitApiToAmpRegistry(api_url);
121
+ return {
122
+ structuredContent: result,
123
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
124
+ };
125
+ });
126
+ server.registerTool('check_amp_submission_status', {
127
+ title: toolMeta('check_amp_submission_status').title,
128
+ description: toolMeta('check_amp_submission_status').description,
129
+ annotations: toolMeta('check_amp_submission_status').annotations,
130
+ outputSchema: submissionStatusOutputSchema,
131
+ inputSchema: {
132
+ submission_id: z
133
+ .string()
134
+ .min(1)
135
+ .describe('Submission id returned by submit_api_to_amp_registry.'),
136
+ },
137
+ }, async ({ submission_id }) => {
138
+ const result = await getAmpSubmissionStatus(submission_id);
139
+ return {
140
+ structuredContent: result,
141
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
142
+ };
143
+ });
93
144
  return server;
94
145
  }
95
146
  //# sourceMappingURL=create-server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-server.js","sourceRoot":"","sources":["../src/create-server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create-server.js","sourceRoot":"","sources":["../src/create-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEzF,OAAO,EACL,oBAAoB,EACpB,yBAAyB,EACzB,0BAA0B,EAC1B,yBAAyB,EACzB,4BAA4B,EAC5B,4BAA4B,EAC5B,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAE;IAChC,MAAM,IAAI,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAC9D,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,IAAI,EAAE,CAAC,CAAC;IAClE,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,UAAU,kBAAkB;IAChC,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B;QACE,IAAI,EAAE,yBAAyB;QAC/B,OAAO,EAAE,OAAO;KACjB,EACD;QACE,YAAY,EAAE;YACZ,6EAA6E;YAC7E,+GAA+G;YAC/G,6DAA6D;YAC7D,kJAAkJ;YAClJ,kLAAkL;YAClL,oHAAoH;SACrH,CAAC,IAAI,CAAC,GAAG,CAAC;KACZ,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,0BAA0B,EAC1B;QACE,KAAK,EAAE,QAAQ,CAAC,0BAA0B,CAAC,CAAC,KAAK;QACjD,WAAW,EAAE,QAAQ,CAAC,0BAA0B,CAAC,CAAC,WAAW;QAC7D,WAAW,EAAE,QAAQ,CAAC,0BAA0B,CAAC,CAAC,WAAW;QAC7D,YAAY,EAAE,yBAAyB;QACvC,WAAW,EAAE;YACX,MAAM,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,CACP,6HAA6H,CAC9H;SACJ;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACnB,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACnD,OAAO;YACL,iBAAiB,EAAE,MAA4C;YAC/D,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;iBACtC;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,0BAA0B,EAC1B;QACE,KAAK,EAAE,QAAQ,CAAC,0BAA0B,CAAC,CAAC,KAAK;QACjD,WAAW,EAAE,QAAQ,CAAC,0BAA0B,CAAC,CAAC,WAAW;QAC7D,WAAW,EAAE,QAAQ,CAAC,0BAA0B,CAAC,CAAC,WAAW;QAC7D,YAAY,EAAE,0BAA0B;QACxC,WAAW,EAAE;YACX,QAAQ,EAAE,CAAC;iBACR,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,oBAAoB,CAAC,CAAC;iBACzC,QAAQ,CACP,4GAA4G,CAC7G;SACJ;KACF,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACrB,MAAM,MAAM,GAAG,sBAAsB,CAAC,QAA4C,CAAC,CAAC;QACpF,OAAO;YACL,iBAAiB,EAAE,MAA4C;YAC/D,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;iBACtC;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,yBAAyB,EACzB;QACE,KAAK,EAAE,QAAQ,CAAC,yBAAyB,CAAC,CAAC,KAAK;QAChD,WAAW,EAAE,QAAQ,CAAC,yBAAyB,CAAC,CAAC,WAAW;QAC5D,WAAW,EAAE,QAAQ,CAAC,yBAAyB,CAAC,CAAC,WAAW;QAC5D,YAAY,EAAE,4BAA4B;QAC1C,WAAW,EAAE;YACX,MAAM,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,CACP,mHAAmH,CACpH;YACH,QAAQ,EAAE,oBAAoB;YAC9B,uBAAuB,EAAE,CAAC;iBACvB,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,QAAQ,CAAC,kEAAkE,CAAC;YAC/E,iBAAiB,EAAE,CAAC;iBACjB,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,QAAQ,CAAC,sEAAsE,CAAC;SACpF;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,EAAE,EAAE;QACzE,MAAM,MAAM,GAAG,qBAAqB,CAAC,MAAM,EAAE,QAAuB,EAAE;YACpE,uBAAuB;YACvB,iBAAiB;SAClB,CAAC,CAAC;QACH,OAAO;YACL,iBAAiB,EAAE,MAA4C;YAC/D,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;iBACtC;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,4BAA4B,EAC5B;QACE,KAAK,EAAE,QAAQ,CAAC,4BAA4B,CAAC,CAAC,KAAK;QACnD,WAAW,EAAE,QAAQ,CAAC,4BAA4B,CAAC,CAAC,WAAW;QAC/D,WAAW,EAAE,QAAQ,CAAC,4BAA4B,CAAC,CAAC,WAAW;QAC/D,YAAY,EAAE,yBAAyB;QACvC,WAAW,EAAE;YACX,OAAO,EAAE,CAAC;iBACP,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,CACP,gHAAgH,CACjH;SACJ;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QACpB,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,OAAO,CAAC,CAAC;QACrD,OAAO;YACL,iBAAiB,EAAE,MAA4C;YAC/D,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACnE,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,6BAA6B,EAC7B;QACE,KAAK,EAAE,QAAQ,CAAC,6BAA6B,CAAC,CAAC,KAAK;QACpD,WAAW,EAAE,QAAQ,CAAC,6BAA6B,CAAC,CAAC,WAAW;QAChE,WAAW,EAAE,QAAQ,CAAC,6BAA6B,CAAC,CAAC,WAAW;QAChE,YAAY,EAAE,4BAA4B;QAC1C,WAAW,EAAE;YACX,aAAa,EAAE,CAAC;iBACb,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,CAAC,uDAAuD,CAAC;SACrE;KACF,EACD,KAAK,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE;QAC1B,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,aAAa,CAAC,CAAC;QAC3D,OAAO;YACL,iBAAiB,EAAE,MAA4C;YAC/D,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACnE,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=submit-listing.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submit-listing.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/submit-listing.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,46 @@
1
+ import { afterEach, describe, expect, it, vi } from 'vitest';
2
+ import { getAmpSubmissionStatus, submitApiToAmpRegistry } from '../submit-listing.js';
3
+ describe('submit-listing', () => {
4
+ afterEach(() => {
5
+ vi.restoreAllMocks();
6
+ });
7
+ it('submits normalized HTTPS origin', async () => {
8
+ const fetchMock = vi.fn().mockResolvedValue({
9
+ ok: true,
10
+ status: 202,
11
+ json: async () => ({
12
+ data: {
13
+ submission_id: 'sub_test',
14
+ status: 'pending',
15
+ status_url: '/listings/submit/sub_test/status',
16
+ message: 'ok',
17
+ },
18
+ }),
19
+ });
20
+ vi.stubGlobal('fetch', fetchMock);
21
+ const result = await submitApiToAmpRegistry('bakebase.agent-manifest.com');
22
+ expect(result.submission_id).toBe('sub_test');
23
+ expect(result.status_poll_url).toContain('/listings/submit/sub_test/status');
24
+ expect(JSON.parse(fetchMock.mock.calls[0][1].body)).toEqual({
25
+ url: 'https://bakebase.agent-manifest.com',
26
+ });
27
+ });
28
+ it('loads submission status', async () => {
29
+ vi.stubGlobal('fetch', vi.fn().mockResolvedValue({
30
+ ok: true,
31
+ status: 200,
32
+ json: async () => ({
33
+ data: {
34
+ submission_id: 'sub_test',
35
+ url: 'https://example.com',
36
+ status: 'approved',
37
+ listing_url: '/listings/abc',
38
+ },
39
+ }),
40
+ }));
41
+ const status = await getAmpSubmissionStatus('sub_test');
42
+ expect(status.status).toBe('approved');
43
+ expect(status.listing_url).toContain('/listings/abc');
44
+ });
45
+ });
46
+ //# sourceMappingURL=submit-listing.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submit-listing.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/submit-listing.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAEtF,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YAC1C,EAAE,EAAE,IAAI;YACR,MAAM,EAAE,GAAG;YACX,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;gBACjB,IAAI,EAAE;oBACJ,aAAa,EAAE,UAAU;oBACzB,MAAM,EAAE,SAAS;oBACjB,UAAU,EAAE,kCAAkC;oBAC9C,OAAO,EAAE,IAAI;iBACd;aACF,CAAC;SACH,CAAC,CAAC;QACH,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAElC,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,6BAA6B,CAAC,CAAC;QAC3E,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC;QAC7E,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAc,CAAC,CAAC,CAAC,OAAO,CAAC;YACpE,GAAG,EAAE,qCAAqC;SAC3C,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;QACvC,EAAE,CAAC,UAAU,CACX,OAAO,EACP,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YACxB,EAAE,EAAE,IAAI;YACR,MAAM,EAAE,GAAG;YACX,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;gBACjB,IAAI,EAAE;oBACJ,aAAa,EAAE,UAAU;oBACzB,GAAG,EAAE,qBAAqB;oBAC1B,MAAM,EAAE,UAAU;oBAClB,WAAW,EAAE,eAAe;iBAC7B;aACF,CAAC;SACH,CAAC,CACH,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,UAAU,CAAC,CAAC;QACxD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,21 @@
1
+ export declare function getRegistryBaseUrl(): string;
2
+ export interface SubmitListingResult {
3
+ submission_id: string;
4
+ status: string;
5
+ status_url: string;
6
+ status_poll_url: string;
7
+ message: string;
8
+ }
9
+ export interface SubmissionStatusResult {
10
+ submission_id: string;
11
+ url: string;
12
+ status: string;
13
+ created_at?: string;
14
+ listing_id?: string;
15
+ listing_url?: string;
16
+ error?: string;
17
+ message?: string;
18
+ }
19
+ export declare function submitApiToAmpRegistry(apiUrl: string): Promise<SubmitListingResult>;
20
+ export declare function getAmpSubmissionStatus(submissionId: string): Promise<SubmissionStatusResult>;
21
+ //# sourceMappingURL=submit-listing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submit-listing.d.ts","sourceRoot":"","sources":["../../src/lib/submit-listing.ts"],"names":[],"mappings":"AAEA,wBAAgB,kBAAkB,IAAI,MAAM,CAG3C;AAYD,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA4DzF;AAED,wBAAsB,sBAAsB,CAC1C,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,sBAAsB,CAAC,CA0CjC"}
@@ -0,0 +1,92 @@
1
+ const DEFAULT_REGISTRY = 'https://api.agent-manifest.com';
2
+ export function getRegistryBaseUrl() {
3
+ const raw = process.env.AMP_REGISTRY_API_URL?.trim();
4
+ return raw ? raw.replace(/\/+$/, '') : DEFAULT_REGISTRY;
5
+ }
6
+ function normalizeApiUrl(url) {
7
+ const trimmed = url.trim();
8
+ const withScheme = /^https?:\/\//i.test(trimmed) ? trimmed : `https://${trimmed}`;
9
+ const parsed = new URL(withScheme);
10
+ if (parsed.protocol !== 'https:') {
11
+ throw new Error('API URL must use HTTPS');
12
+ }
13
+ return parsed.origin;
14
+ }
15
+ export async function submitApiToAmpRegistry(apiUrl) {
16
+ const origin = normalizeApiUrl(apiUrl);
17
+ const base = getRegistryBaseUrl();
18
+ const timeoutMs = Number.parseInt(process.env.AMP_FETCH_TIMEOUT_MS ?? '15000', 10);
19
+ const controller = new AbortController();
20
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
21
+ let response;
22
+ try {
23
+ response = await fetch(`${base}/listings/submit`, {
24
+ method: 'POST',
25
+ headers: { 'Content-Type': 'application/json', Accept: 'application/json' },
26
+ body: JSON.stringify({ url: origin }),
27
+ signal: controller.signal,
28
+ });
29
+ }
30
+ finally {
31
+ clearTimeout(timer);
32
+ }
33
+ const body = (await response.json().catch(() => ({})));
34
+ if (response.status === 409) {
35
+ throw new Error(body.message ??
36
+ `API already listed${body.listing_id ? ` (listing_id: ${body.listing_id})` : ''}`);
37
+ }
38
+ if (!response.ok) {
39
+ throw new Error(body.message ?? body.error ?? `Registry submit failed (${response.status})`);
40
+ }
41
+ const submissionId = body.data?.submission_id;
42
+ const statusPath = body.data?.status_url;
43
+ if (!submissionId || !statusPath) {
44
+ throw new Error('Registry returned an unexpected submit response');
45
+ }
46
+ const statusPollUrl = statusPath.startsWith('http')
47
+ ? statusPath
48
+ : `${base}${statusPath.startsWith('/') ? '' : '/'}${statusPath}`;
49
+ return {
50
+ submission_id: submissionId,
51
+ status: body.data?.status ?? 'pending',
52
+ status_url: statusPath,
53
+ status_poll_url: statusPollUrl,
54
+ message: body.data?.message ?? 'Submission accepted.',
55
+ };
56
+ }
57
+ export async function getAmpSubmissionStatus(submissionId) {
58
+ const id = submissionId.trim();
59
+ if (!id)
60
+ throw new Error('submission_id is required');
61
+ const base = getRegistryBaseUrl();
62
+ const timeoutMs = Number.parseInt(process.env.AMP_FETCH_TIMEOUT_MS ?? '15000', 10);
63
+ const controller = new AbortController();
64
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
65
+ let response;
66
+ try {
67
+ response = await fetch(`${base}/listings/submit/${encodeURIComponent(id)}/status`, {
68
+ headers: { Accept: 'application/json' },
69
+ signal: controller.signal,
70
+ });
71
+ }
72
+ finally {
73
+ clearTimeout(timer);
74
+ }
75
+ const body = (await response.json().catch(() => ({})));
76
+ if (response.status === 404) {
77
+ throw new Error(body.message ?? 'Submission not found');
78
+ }
79
+ if (!response.ok) {
80
+ throw new Error(body.message ?? body.error ?? `Status check failed (${response.status})`);
81
+ }
82
+ if (!body.data?.submission_id) {
83
+ throw new Error('Registry returned an unexpected status response');
84
+ }
85
+ const data = body.data;
86
+ let listingUrl = data.listing_url;
87
+ if (listingUrl && !listingUrl.startsWith('http')) {
88
+ listingUrl = `${base}${listingUrl.startsWith('/') ? '' : '/'}${listingUrl}`;
89
+ }
90
+ return { ...data, listing_url: listingUrl };
91
+ }
92
+ //# sourceMappingURL=submit-listing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submit-listing.js","sourceRoot":"","sources":["../../src/lib/submit-listing.ts"],"names":[],"mappings":"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"}