@agentmanifest/mcp-server 0.0.0-stage → 0.1.2

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.
Files changed (45) hide show
  1. package/README.md +212 -2
  2. package/dist/create-server.d.ts +3 -0
  3. package/dist/create-server.d.ts.map +1 -0
  4. package/dist/create-server.js +95 -0
  5. package/dist/create-server.js.map +1 -0
  6. package/dist/http.d.ts +3 -0
  7. package/dist/http.d.ts.map +1 -0
  8. package/dist/http.js +74 -0
  9. package/dist/http.js.map +1 -0
  10. package/dist/index.d.ts +3 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +13 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/lib/__tests__/check-permissions.test.d.ts +2 -0
  15. package/dist/lib/__tests__/check-permissions.test.d.ts.map +1 -0
  16. package/dist/lib/__tests__/check-permissions.test.js +29 -0
  17. package/dist/lib/__tests__/check-permissions.test.js.map +1 -0
  18. package/dist/lib/check-permissions.d.ts +13 -0
  19. package/dist/lib/check-permissions.d.ts.map +1 -0
  20. package/dist/lib/check-permissions.js +188 -0
  21. package/dist/lib/check-permissions.js.map +1 -0
  22. package/dist/lib/fetch-manifest.d.ts +5 -0
  23. package/dist/lib/fetch-manifest.d.ts.map +1 -0
  24. package/dist/lib/fetch-manifest.js +74 -0
  25. package/dist/lib/fetch-manifest.js.map +1 -0
  26. package/dist/lib/resolve-manifest-url.d.ts +5 -0
  27. package/dist/lib/resolve-manifest-url.d.ts.map +1 -0
  28. package/dist/lib/resolve-manifest-url.js +8 -0
  29. package/dist/lib/resolve-manifest-url.js.map +1 -0
  30. package/dist/lib/schemas.d.ts +3 -0
  31. package/dist/lib/schemas.d.ts.map +1 -0
  32. package/dist/lib/schemas.js +8 -0
  33. package/dist/lib/schemas.js.map +1 -0
  34. package/dist/lib/types.d.ts +84 -0
  35. package/dist/lib/types.d.ts.map +1 -0
  36. package/dist/lib/types.js +2 -0
  37. package/dist/lib/types.js.map +1 -0
  38. package/dist/lib/validate-syntax.d.ts +3 -0
  39. package/dist/lib/validate-syntax.d.ts.map +1 -0
  40. package/dist/lib/validate-syntax.js +52 -0
  41. package/dist/lib/validate-syntax.js.map +1 -0
  42. package/package.json +62 -4
  43. package/schemas/v0.2/manifest.json +290 -0
  44. package/schemas/v0.3/manifest.json +488 -0
  45. package/smithery.yaml +31 -0
@@ -0,0 +1,188 @@
1
+ const RESTRICTION_PATTERNS = [
2
+ {
3
+ pattern: /\b(do not|don't|must not|prohibited|forbidden)\b[^.]{0,80}\b(scrape|bulk|crawl|harvest|mirror)\b/i,
4
+ code: 'agent_notes_usage_restriction',
5
+ message: 'Agent notes appear to prohibit bulk scraping or mirroring.',
6
+ },
7
+ {
8
+ pattern: /\b(no automated|no automation|human.?in.?the.?loop|manual approval)\b/i,
9
+ code: 'agent_notes_human_required',
10
+ message: 'Agent notes suggest human approval or non-automated use.',
11
+ },
12
+ {
13
+ pattern: /\b(commercial use|resale|redistribut(e|ion))\b[^.]{0,60}\b(prohibited|not permitted|forbidden)\b/i,
14
+ code: 'agent_notes_commercial_restriction',
15
+ message: 'Agent notes may restrict commercial or redistribution use.',
16
+ },
17
+ ];
18
+ const ACTION_RESTRICTION_TRIGGERS = [
19
+ {
20
+ actionPattern: /\b(scrape|crawl|bulk|mirror|harvest)\b/i,
21
+ notesPattern: /\b(do not|don't|must not|prohibited)\b/i,
22
+ code: 'action_vs_notes_scraping',
23
+ message: 'Requested action looks like bulk/scraping while agent notes contain prohibitive language.',
24
+ },
25
+ ];
26
+ export function parseAction(action) {
27
+ const trimmed = action.trim();
28
+ const urlMatch = trimmed.match(/^(GET|POST|PUT|PATCH|DELETE)\s+(https?:\/\/[^\s]+)/i);
29
+ if (urlMatch) {
30
+ try {
31
+ const u = new URL(urlMatch[2]);
32
+ return { method: urlMatch[1].toUpperCase(), path: u.pathname };
33
+ }
34
+ catch {
35
+ return { method: urlMatch[1].toUpperCase(), path: null };
36
+ }
37
+ }
38
+ const methodPath = trimmed.match(/^(GET|POST|PUT|PATCH|DELETE)\s+(\/[^\s?]*)/i);
39
+ if (methodPath) {
40
+ return { method: methodPath[1].toUpperCase(), path: methodPath[2] };
41
+ }
42
+ const pathOnly = trimmed.match(/^(\/[^\s?]+)/);
43
+ if (pathOnly) {
44
+ return { method: 'GET', path: pathOnly[1] };
45
+ }
46
+ return { method: null, path: null };
47
+ }
48
+ function normalizePath(path) {
49
+ if (path.length > 1 && path.endsWith('/')) {
50
+ return path.slice(0, -1);
51
+ }
52
+ return path;
53
+ }
54
+ function findEndpoint(manifest, method, path) {
55
+ if (!manifest.endpoints?.length || !path) {
56
+ return null;
57
+ }
58
+ const normPath = normalizePath(path);
59
+ const m = method?.toUpperCase() ?? null;
60
+ const exact = manifest.endpoints.find((ep) => normalizePath(ep.path) === normPath && (!m || ep.method.toUpperCase() === m));
61
+ if (exact) {
62
+ return exact;
63
+ }
64
+ // Template-style match: /items/{id}
65
+ for (const ep of manifest.endpoints) {
66
+ const pattern = ep.path.replace(/\{[^}]+\}/g, '[^/]+');
67
+ const re = new RegExp(`^${pattern}$`);
68
+ if (re.test(normPath) && (!m || ep.method.toUpperCase() === m)) {
69
+ return ep;
70
+ }
71
+ }
72
+ return null;
73
+ }
74
+ function aggregateVerdict(findings) {
75
+ if (findings.some((f) => f.severity === 'error')) {
76
+ return 'violation';
77
+ }
78
+ if (findings.some((f) => f.severity === 'warning')) {
79
+ return 'warning';
80
+ }
81
+ if (findings.length === 0) {
82
+ return 'unknown';
83
+ }
84
+ return 'compliant';
85
+ }
86
+ export function checkAgentPermissions(action, manifest, options = {}) {
87
+ const parsed = parseAction(action);
88
+ const findings = [];
89
+ const notes = manifest.agent_notes ?? '';
90
+ const matched = findEndpoint(manifest, parsed.method, parsed.path);
91
+ if (parsed.path && !matched) {
92
+ findings.push({
93
+ code: 'endpoint_not_declared',
94
+ severity: 'error',
95
+ message: `No matching endpoint in manifest for ${parsed.method ?? 'ANY'} ${parsed.path}. Agents should only call declared operations.`,
96
+ });
97
+ }
98
+ else if (matched) {
99
+ findings.push({
100
+ code: 'endpoint_declared',
101
+ severity: 'info',
102
+ message: `Matched declared endpoint ${matched.method} ${matched.path}.`,
103
+ });
104
+ }
105
+ else {
106
+ findings.push({
107
+ code: 'action_unparsed',
108
+ severity: 'warning',
109
+ message: 'Could not parse HTTP method/path from action. Pass values like "POST /baking/validate-mix" or "GET https://api.example.com/health".',
110
+ });
111
+ }
112
+ if (manifest.authentication?.required) {
113
+ if (options.intends_unauthenticated) {
114
+ findings.push({
115
+ code: 'auth_required',
116
+ severity: 'error',
117
+ message: `Manifest requires authentication (${manifest.authentication.type ?? 'credentials'}). ${manifest.authentication.instructions ?? ''}`.trim(),
118
+ });
119
+ }
120
+ else {
121
+ findings.push({
122
+ code: 'auth_required',
123
+ severity: 'warning',
124
+ message: `Authentication is required (${manifest.authentication.type}). Ensure credentials are included per manifest instructions.`,
125
+ });
126
+ }
127
+ }
128
+ const payment = manifest.payment;
129
+ const paidPricing = manifest.pricing?.model &&
130
+ !['free', 'unknown'].includes(manifest.pricing.model);
131
+ if (payment && payment.onboarding?.url && !options.payment_onboarded) {
132
+ findings.push({
133
+ code: 'payment_onboarding',
134
+ severity: 'warning',
135
+ message: `Payment block present; complete onboarding at ${payment.onboarding.url} before paid usage.`,
136
+ });
137
+ }
138
+ else if (paidPricing && !payment && !options.payment_onboarded) {
139
+ findings.push({
140
+ code: 'pricing_paid',
141
+ severity: 'info',
142
+ message: `Pricing model is "${manifest.pricing?.model}"; confirm billing terms in agent_notes before high-volume use.`,
143
+ });
144
+ }
145
+ if (manifest.rate_limits?.requests_per_minute || manifest.rate_limits?.requests_per_day) {
146
+ findings.push({
147
+ code: 'rate_limits',
148
+ severity: 'info',
149
+ message: `Rate limits apply (rpm: ${manifest.rate_limits.requests_per_minute ?? 'n/a'}, rpd: ${manifest.rate_limits.requests_per_day ?? 'n/a'}).`,
150
+ });
151
+ }
152
+ const termsUrl = payment?.refund_policy?.terms_url;
153
+ if (termsUrl) {
154
+ findings.push({
155
+ code: 'terms_url',
156
+ severity: 'info',
157
+ message: `Refund/terms documented at ${termsUrl}.`,
158
+ });
159
+ }
160
+ for (const rule of RESTRICTION_PATTERNS) {
161
+ if (rule.pattern.test(notes)) {
162
+ findings.push({
163
+ code: rule.code,
164
+ severity: 'warning',
165
+ message: rule.message,
166
+ });
167
+ }
168
+ }
169
+ for (const rule of ACTION_RESTRICTION_TRIGGERS) {
170
+ if (rule.actionPattern.test(action) && rule.notesPattern.test(notes)) {
171
+ findings.push({
172
+ code: rule.code,
173
+ severity: 'error',
174
+ message: rule.message,
175
+ });
176
+ }
177
+ }
178
+ const verdict = aggregateVerdict(findings);
179
+ const compliant = verdict === 'compliant' || verdict === 'warning';
180
+ return {
181
+ verdict,
182
+ compliant,
183
+ action: { raw: action, method: parsed.method, path: parsed.path },
184
+ findings,
185
+ matched_endpoint: matched,
186
+ };
187
+ }
188
+ //# sourceMappingURL=check-permissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-permissions.js","sourceRoot":"","sources":["../../src/lib/check-permissions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { FetchManifestResult } from './types.js';
2
+ /** RFC 8615 primary path plus common publisher fallbacks. */
3
+ export declare const MANIFEST_PATH_CANDIDATES: readonly ["/.well-known/agent-manifest.json", "/.well-known/amp.json", "/agent-manifest.json"];
4
+ export declare function fetchManifestByDomain(domain: string): Promise<FetchManifestResult>;
5
+ //# sourceMappingURL=fetch-manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-manifest.d.ts","sourceRoot":"","sources":["../../src/lib/fetch-manifest.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAe,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEnE,6DAA6D;AAC7D,eAAO,MAAM,wBAAwB,gGAI3B,CAAC;AAkDX,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAwBxF"}
@@ -0,0 +1,74 @@
1
+ import { resolveManifestUrl } from './resolve-manifest-url.js';
2
+ /** RFC 8615 primary path plus common publisher fallbacks. */
3
+ export const MANIFEST_PATH_CANDIDATES = [
4
+ '/.well-known/agent-manifest.json',
5
+ '/.well-known/amp.json',
6
+ '/agent-manifest.json',
7
+ ];
8
+ function normalizeDomain(domain) {
9
+ const trimmed = domain.trim().replace(/\/+$/, '');
10
+ const withoutScheme = trimmed.replace(/^https?:\/\//i, '');
11
+ const host = withoutScheme.split('/')[0] ?? withoutScheme;
12
+ return host;
13
+ }
14
+ function originFromDomain(domain) {
15
+ const host = normalizeDomain(domain);
16
+ return `https://${host}`;
17
+ }
18
+ function manifestUrlsForOrigin(origin) {
19
+ const base = origin.endsWith('/') ? origin.slice(0, -1) : origin;
20
+ return MANIFEST_PATH_CANDIDATES.map((p) => `${base}${p}`);
21
+ }
22
+ function getFetchTimeoutMs() {
23
+ const raw = process.env.AMP_FETCH_TIMEOUT_MS;
24
+ const n = raw ? Number.parseInt(raw, 10) : 15_000;
25
+ return Number.isFinite(n) && n > 0 ? n : 15_000;
26
+ }
27
+ async function fetchJson(url) {
28
+ const controller = new AbortController();
29
+ const timeout = setTimeout(() => controller.abort(), getFetchTimeoutMs());
30
+ try {
31
+ const response = await fetch(url, {
32
+ signal: controller.signal,
33
+ headers: { Accept: 'application/json' },
34
+ });
35
+ if (!response.ok) {
36
+ return { ok: false, status: response.status, error: `HTTP ${response.status}` };
37
+ }
38
+ const contentType = response.headers.get('content-type') ?? '';
39
+ if (!contentType.includes('json')) {
40
+ return { ok: false, error: `Unexpected Content-Type: ${contentType || '(none)'}` };
41
+ }
42
+ const data = (await response.json());
43
+ return { ok: true, data };
44
+ }
45
+ catch (err) {
46
+ const message = err instanceof Error ? err.message : String(err);
47
+ return { ok: false, error: message };
48
+ }
49
+ finally {
50
+ clearTimeout(timeout);
51
+ }
52
+ }
53
+ export async function fetchManifestByDomain(domain) {
54
+ const host = normalizeDomain(domain);
55
+ const origin = originFromDomain(host);
56
+ const canonical = resolveManifestUrl(origin);
57
+ const tried = manifestUrlsForOrigin(origin);
58
+ const errors = [];
59
+ for (const url of tried) {
60
+ const result = await fetchJson(url);
61
+ if (result.ok) {
62
+ return {
63
+ domain: host,
64
+ origin,
65
+ manifest_url: url,
66
+ tried_urls: tried,
67
+ manifest: result.data,
68
+ };
69
+ }
70
+ errors.push(`${url}: ${result.error}`);
71
+ }
72
+ throw new Error(`Could not fetch an AMP manifest for ${host}. Tried ${tried.length} URL(s). Canonical: ${canonical}. Details: ${errors.join(' | ')}`);
73
+ }
74
+ //# sourceMappingURL=fetch-manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-manifest.js","sourceRoot":"","sources":["../../src/lib/fetch-manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAG/D,6DAA6D;AAC7D,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,kCAAkC;IAClC,uBAAuB;IACvB,sBAAsB;CACd,CAAC;AAEX,SAAS,eAAe,CAAC,MAAc;IACrC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAClD,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC;IAC1D,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAc;IACtC,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACrC,OAAO,WAAW,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED,SAAS,qBAAqB,CAAC,MAAc;IAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACjE,OAAO,wBAAwB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,iBAAiB;IACxB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IAC7C,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAClD,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AAClD,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,GAAW;IAClC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,iBAAiB,EAAE,CAAC,CAAC;IAC1E,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;SACxC,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QAClF,CAAC;QACD,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QAC/D,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAClC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,4BAA4B,WAAW,IAAI,QAAQ,EAAE,EAAE,CAAC;QACrF,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAgB,CAAC;QACpD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC5B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IACvC,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,MAAc;IACxD,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,SAAS,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAE5C,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;YACd,OAAO;gBACL,MAAM,EAAE,IAAI;gBACZ,MAAM;gBACN,YAAY,EAAE,GAAG;gBACjB,UAAU,EAAE,KAAK;gBACjB,QAAQ,EAAE,MAAM,CAAC,IAAI;aACtB,CAAC;QACJ,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,IAAI,KAAK,CACb,uCAAuC,IAAI,WAAW,KAAK,CAAC,MAAM,uBAAuB,SAAS,cAAc,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CACrI,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Origin-level manifest URL per RFC 8615 (matches @agentmanifest/validator).
3
+ */
4
+ export declare function resolveManifestUrl(url: string): string;
5
+ //# sourceMappingURL=resolve-manifest-url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-manifest-url.d.ts","sourceRoot":"","sources":["../../src/lib/resolve-manifest-url.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGtD"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Origin-level manifest URL per RFC 8615 (matches @agentmanifest/validator).
3
+ */
4
+ export function resolveManifestUrl(url) {
5
+ const withScheme = /^https?:\/\//i.test(url) ? url : `https://${url}`;
6
+ return new URL('/.well-known/agent-manifest.json', withScheme).toString();
7
+ }
8
+ //# sourceMappingURL=resolve-manifest-url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-manifest-url.js","sourceRoot":"","sources":["../../src/lib/resolve-manifest-url.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,GAAG,EAAE,CAAC;IACtE,OAAO,IAAI,GAAG,CAAC,kCAAkC,EAAE,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAC;AAC5E,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare const CURRENT_SPEC_VERSION = "agentmanifest-0.3";
2
+ export declare const SCHEMAS: Record<string, object>;
3
+ //# sourceMappingURL=schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/lib/schemas.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,oBAAoB,sBAAsB,CAAC;AAExD,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAG1C,CAAC"}
@@ -0,0 +1,8 @@
1
+ import schemaV02 from '../../schemas/v0.2/manifest.json' with { type: 'json' };
2
+ import schemaV03 from '../../schemas/v0.3/manifest.json' with { type: 'json' };
3
+ export const CURRENT_SPEC_VERSION = 'agentmanifest-0.3';
4
+ export const SCHEMAS = {
5
+ 'agentmanifest-0.2': schemaV02,
6
+ 'agentmanifest-0.3': schemaV03,
7
+ };
8
+ //# sourceMappingURL=schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/lib/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,kCAAkC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC/E,OAAO,SAAS,MAAM,kCAAkC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAE/E,MAAM,CAAC,MAAM,oBAAoB,GAAG,mBAAmB,CAAC;AAExD,MAAM,CAAC,MAAM,OAAO,GAA2B;IAC7C,mBAAmB,EAAE,SAAS;IAC9B,mBAAmB,EAAE,SAAS;CAC/B,CAAC"}
@@ -0,0 +1,84 @@
1
+ /** Minimal manifest shape for permission checks (AMP v0.2/v0.3). */
2
+ export interface AmpManifest {
3
+ spec_version?: string;
4
+ name?: string;
5
+ version?: string;
6
+ description?: string;
7
+ homepage?: string;
8
+ endpoints?: Array<{
9
+ path: string;
10
+ method: string;
11
+ description: string;
12
+ parameters?: unknown;
13
+ response_description?: string;
14
+ cost_hint?: {
15
+ unit: string;
16
+ estimated_price: string;
17
+ currency: string;
18
+ notes?: string;
19
+ };
20
+ }>;
21
+ authentication?: {
22
+ required?: boolean;
23
+ type?: string | null;
24
+ instructions?: string | null;
25
+ };
26
+ pricing?: {
27
+ model?: string;
28
+ free_tier?: unknown;
29
+ paid_tier?: unknown;
30
+ };
31
+ payment?: null | {
32
+ model?: string;
33
+ onboarding?: {
34
+ url?: string;
35
+ };
36
+ budget_controls?: Record<string, unknown>;
37
+ refund_policy?: {
38
+ terms_url?: string | null;
39
+ };
40
+ };
41
+ rate_limits?: {
42
+ requests_per_minute?: number | null;
43
+ requests_per_day?: number | null;
44
+ burst?: number | null;
45
+ notes?: string | null;
46
+ };
47
+ agent_notes?: string;
48
+ contact?: Record<string, unknown>;
49
+ }
50
+ export interface FetchManifestResult {
51
+ domain: string;
52
+ origin: string;
53
+ manifest_url: string;
54
+ tried_urls: string[];
55
+ manifest: AmpManifest;
56
+ }
57
+ export interface SyntaxValidationResult {
58
+ valid: boolean;
59
+ spec_version: string | null;
60
+ schema_checked: string | null;
61
+ errors: string[];
62
+ success_token: string | null;
63
+ }
64
+ export type PermissionVerdict = 'compliant' | 'violation' | 'warning' | 'unknown';
65
+ export interface PermissionCheckResult {
66
+ verdict: PermissionVerdict;
67
+ compliant: boolean;
68
+ action: {
69
+ raw: string;
70
+ method: string | null;
71
+ path: string | null;
72
+ };
73
+ findings: Array<{
74
+ code: string;
75
+ severity: 'error' | 'warning' | 'info';
76
+ message: string;
77
+ }>;
78
+ matched_endpoint: {
79
+ path: string;
80
+ method: string;
81
+ description: string;
82
+ } | null;
83
+ }
84
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import type { SyntaxValidationResult } from './types.js';
2
+ export declare function validateManifestSyntax(manifestInput: string | Record<string, unknown>): SyntaxValidationResult;
3
+ //# sourceMappingURL=validate-syntax.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-syntax.d.ts","sourceRoot":"","sources":["../../src/lib/validate-syntax.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAsBzD,wBAAgB,sBAAsB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,sBAAsB,CAyC9G"}
@@ -0,0 +1,52 @@
1
+ import AjvModule from 'ajv';
2
+ import addFormatsModule from 'ajv-formats';
3
+ const Ajv = AjvModule.default ?? AjvModule;
4
+ const addFormats = addFormatsModule.default ?? addFormatsModule;
5
+ import { CURRENT_SPEC_VERSION, SCHEMAS } from './schemas.js';
6
+ const ajv = new Ajv({ allErrors: true, strict: false });
7
+ addFormats(ajv);
8
+ const validators = Object.fromEntries(Object.entries(SCHEMAS).map(([version, schema]) => [version, ajv.compile(schema)]));
9
+ const SUPPORTED = Object.keys(SCHEMAS);
10
+ function parseManifestInput(input) {
11
+ if (typeof input === 'string') {
12
+ try {
13
+ return JSON.parse(input);
14
+ }
15
+ catch (err) {
16
+ throw new Error(`Invalid JSON string: ${err.message}`);
17
+ }
18
+ }
19
+ return input;
20
+ }
21
+ export function validateManifestSyntax(manifestInput) {
22
+ const manifest = parseManifestInput(manifestInput);
23
+ const specVersion = typeof manifest.spec_version === 'string' ? manifest.spec_version : null;
24
+ const version = specVersion && validators[specVersion] ? specVersion : CURRENT_SPEC_VERSION;
25
+ const validate = validators[version];
26
+ const valid = validate(manifest);
27
+ if (!valid) {
28
+ const errors = validate.errors?.map((e) => {
29
+ const path = e.instancePath || '/';
30
+ return `${path} ${e.message ?? 'invalid'}`.trim();
31
+ }) ?? ['Unknown schema error'];
32
+ if (specVersion && !SUPPORTED.includes(specVersion)) {
33
+ errors.unshift(`Unsupported spec_version "${specVersion}". Supported: ${SUPPORTED.join(', ')}.`);
34
+ }
35
+ return {
36
+ valid: false,
37
+ spec_version: specVersion,
38
+ schema_checked: version,
39
+ errors,
40
+ success_token: null,
41
+ };
42
+ }
43
+ const token = `amp-schema-valid:${version}:${typeof manifest.name === 'string' ? manifest.name : 'unknown'}`;
44
+ return {
45
+ valid: true,
46
+ spec_version: specVersion ?? version,
47
+ schema_checked: version,
48
+ errors: [],
49
+ success_token: token,
50
+ };
51
+ }
52
+ //# sourceMappingURL=validate-syntax.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-syntax.js","sourceRoot":"","sources":["../../src/lib/validate-syntax.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,64 @@
1
1
  {
2
2
  "name": "@agentmanifest/mcp-server",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.2",
4
+ "mcpName": "com.agent-manifest/amp-mcp",
5
+ "description": "Official MCP server for the Agent Manifest Protocol (AMP) — discover, validate, and check agent permissions against agent-manifest.json",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "bin": {
10
+ "amp-mcp": "./dist/index.js",
11
+ "amp-mcp-http": "./dist/http.js"
12
+ },
13
+ "files": [
14
+ "dist",
15
+ "schemas",
16
+ "smithery.yaml",
17
+ "README.md"
18
+ ],
19
+ "scripts": {
20
+ "build": "tsc",
21
+ "dev": "tsx watch src/http.ts",
22
+ "dev:stdio": "tsx src/index.ts",
23
+ "start": "node dist/http.js",
24
+ "start:stdio": "node dist/index.js",
25
+ "test": "vitest run",
26
+ "prepublishOnly": "npm run build"
27
+ },
28
+ "keywords": [
29
+ "mcp",
30
+ "model-context-protocol",
31
+ "agent-manifest",
32
+ "amp",
33
+ "agent-manifest-protocol",
34
+ "smithery"
35
+ ],
36
+ "author": "Brandon Weber <brandon@agent-manifest.com>",
37
+ "license": "MIT",
38
+ "repository": {
39
+ "type": "git",
40
+ "url": "https://github.com/AMProtocol/AMP.git",
41
+ "directory": "amp-mcp"
42
+ },
43
+ "homepage": "https://agent-manifest.com",
44
+ "bugs": {
45
+ "url": "https://github.com/AMProtocol/AMP/issues"
46
+ },
47
+ "engines": {
48
+ "node": ">=18.0.0"
49
+ },
50
+ "dependencies": {
51
+ "@modelcontextprotocol/sdk": "^1.32.0",
52
+ "ajv": "^8.12.0",
53
+ "ajv-formats": "^2.1.1",
54
+ "express": "^4.21.2",
55
+ "zod": "^3.25.0"
56
+ },
57
+ "devDependencies": {
58
+ "@types/express": "^4.17.21",
59
+ "@types/node": "^20.10.6",
60
+ "tsx": "^4.7.0",
61
+ "typescript": "^5.3.3",
62
+ "vitest": "^4.0.18"
63
+ }
64
+ }