@ninomae/mcp-app-server 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.
Files changed (49) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/LICENSE +21 -0
  3. package/README.md +262 -0
  4. package/README.zh-CN.md +204 -0
  5. package/dist/identity.d.ts +27 -0
  6. package/dist/identity.d.ts.map +1 -0
  7. package/dist/identity.js +62 -0
  8. package/dist/identity.js.map +1 -0
  9. package/dist/index.d.ts +33 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +134 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/mcp.d.ts +64 -0
  14. package/dist/mcp.d.ts.map +1 -0
  15. package/dist/mcp.js +76 -0
  16. package/dist/mcp.js.map +1 -0
  17. package/dist/oauth.d.ts +33 -0
  18. package/dist/oauth.d.ts.map +1 -0
  19. package/dist/oauth.js +338 -0
  20. package/dist/oauth.js.map +1 -0
  21. package/dist/rate-limit.d.ts +20 -0
  22. package/dist/rate-limit.d.ts.map +1 -0
  23. package/dist/rate-limit.js +29 -0
  24. package/dist/rate-limit.js.map +1 -0
  25. package/dist/react.d.ts +36 -0
  26. package/dist/react.d.ts.map +1 -0
  27. package/dist/react.js +73 -0
  28. package/dist/react.js.map +1 -0
  29. package/dist/sql.d.ts +27 -0
  30. package/dist/sql.d.ts.map +1 -0
  31. package/dist/sql.js +107 -0
  32. package/dist/sql.js.map +1 -0
  33. package/dist/store.d.ts +106 -0
  34. package/dist/store.d.ts.map +1 -0
  35. package/dist/store.js +122 -0
  36. package/dist/store.js.map +1 -0
  37. package/dist/tokens.d.ts +26 -0
  38. package/dist/tokens.d.ts.map +1 -0
  39. package/dist/tokens.js +61 -0
  40. package/dist/tokens.js.map +1 -0
  41. package/dist/types.d.ts +152 -0
  42. package/dist/types.d.ts.map +1 -0
  43. package/dist/types.js +13 -0
  44. package/dist/types.js.map +1 -0
  45. package/dist/util.d.ts +9 -0
  46. package/dist/util.d.ts.map +1 -0
  47. package/dist/util.js +48 -0
  48. package/dist/util.js.map +1 -0
  49. package/package.json +96 -0
package/dist/sql.js ADDED
@@ -0,0 +1,107 @@
1
+ const DEFAULT_TABLES = { clients: 'agent_clients', codes: 'agent_codes', refreshTokens: 'agent_refresh_tokens', accessTokens: 'agent_access_tokens' };
2
+ function list(raw) {
3
+ if (!raw)
4
+ return [];
5
+ try {
6
+ const parsed = JSON.parse(raw);
7
+ if (Array.isArray(parsed))
8
+ return parsed.filter((s) => typeof s === 'string');
9
+ }
10
+ catch { }
11
+ return raw.split(/\s+/).filter(Boolean);
12
+ }
13
+ const client = (r) => ({ id: r.client_id, secretHash: r.client_secret_hash, name: r.client_name, redirectUris: list(r.redirect_uris), tokenEndpointAuthMethod: r.token_endpoint_auth_method, scope: r.scope, createdAt: r.created_at, lastUsedAt: r.last_used_at });
14
+ const code = (r) => ({ hash: r.code_hash, clientId: r.client_id, ownerId: r.owner_uid, redirectUri: r.redirect_uri, scopes: list(r.scopes), codeChallenge: r.code_challenge, resource: r.resource, expiresAt: r.expires_at, usedAt: r.used_at, issuedTokenId: r.issued_token_id });
15
+ const refresh = (r) => ({ hash: r.token_hash, clientId: r.client_id, ownerId: r.owner_uid, accessTokenId: r.access_token_id, scopes: list(r.scopes), expiresAt: r.expires_at, revoked: r.revoked === 1, successorId: r.successor_id });
16
+ const access = (r) => ({ id: r.id, hash: r.token_hash, prefix: r.token_prefix, clientId: r.client_id || '', clientName: r.name, ownerId: r.owner_uid, scopes: list(r.scopes), audience: r.audience || '', createdAt: r.created_at, expiresAt: r.expires_at || '', lastUsedAt: r.last_used_at, revoked: r.revoked === 1 });
17
+ /** @param tables Override table names only when adopting an existing schema. */
18
+ export function sqlStore(db, tables = {}) {
19
+ const t = { ...DEFAULT_TABLES, ...tables };
20
+ const q = (sql, ...values) => db.prepare(sql).bind(...values);
21
+ return {
22
+ clients: {
23
+ async create(c) {
24
+ await q(`INSERT INTO ${t.clients}(client_id, client_secret_hash, client_name, redirect_uris, token_endpoint_auth_method, scope, created_at) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)`, c.id, c.secretHash, c.name, JSON.stringify(c.redirectUris), c.tokenEndpointAuthMethod, c.scope, c.createdAt).run();
25
+ },
26
+ async get(id) {
27
+ const row = await q(`SELECT * FROM ${t.clients} WHERE client_id = ?1`, id).first();
28
+ return row ? client(row) : null;
29
+ },
30
+ async touch(id, usedAt) {
31
+ await q(`UPDATE ${t.clients} SET last_used_at = ?1 WHERE client_id = ?2`, usedAt, id).run();
32
+ },
33
+ },
34
+ codes: {
35
+ async create(c) {
36
+ await q(`INSERT INTO ${t.codes}(code_hash, client_id, owner_uid, redirect_uri, scopes, code_challenge, resource, expires_at) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8)`, c.hash, c.clientId, c.ownerId, c.redirectUri, JSON.stringify(c.scopes), c.codeChallenge, c.resource, c.expiresAt).run();
37
+ },
38
+ async get(hash) {
39
+ const row = await q(`SELECT * FROM ${t.codes} WHERE code_hash = ?1`, hash).first();
40
+ return row ? code(row) : null;
41
+ },
42
+ async consume(hash, usedAt) {
43
+ return !!(await q(`UPDATE ${t.codes} SET used_at = ?1 WHERE code_hash = ?2 AND used_at IS NULL`, usedAt, hash).run()).meta.changes;
44
+ },
45
+ async setIssuedToken(hash, id) {
46
+ await q(`UPDATE ${t.codes} SET issued_token_id = ?1 WHERE code_hash = ?2`, id, hash).run();
47
+ },
48
+ },
49
+ refreshTokens: {
50
+ async create(r) {
51
+ await q(`INSERT INTO ${t.refreshTokens}(token_hash, client_id, owner_uid, access_token_id, scopes, expires_at) VALUES (?1, ?2, ?3, ?4, ?5, ?6)`, r.hash, r.clientId, r.ownerId, r.accessTokenId, JSON.stringify(r.scopes), r.expiresAt).run();
52
+ },
53
+ async get(hash) {
54
+ const row = await q(`SELECT * FROM ${t.refreshTokens} WHERE token_hash = ?1`, hash).first();
55
+ return row ? refresh(row) : null;
56
+ },
57
+ async getByAccessToken(id) {
58
+ const row = await q(`SELECT * FROM ${t.refreshTokens} WHERE access_token_id = ?1`, id).first();
59
+ return row ? refresh(row) : null;
60
+ },
61
+ async revoke(hash) {
62
+ return !!(await q(`UPDATE ${t.refreshTokens} SET revoked = 1 WHERE token_hash = ?1 AND revoked = 0`, hash).run()).meta.changes;
63
+ },
64
+ async revokeByAccessToken(id) {
65
+ await q(`UPDATE ${t.refreshTokens} SET revoked = 1 WHERE access_token_id = ?1`, id).run();
66
+ },
67
+ async setSuccessor(hash, id) {
68
+ await q(`UPDATE ${t.refreshTokens} SET successor_id = ?1 WHERE token_hash = ?2`, id, hash).run();
69
+ },
70
+ },
71
+ accessTokens: {
72
+ async create(a) {
73
+ await q(`INSERT INTO ${t.accessTokens}(id, token_hash, token_prefix, name, owner_uid, scopes, created_at, expires_at, revoked, last_used_at, client_id, audience) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, 0, NULL, ?9, ?10)`, a.id, a.hash, a.prefix, a.clientName, a.ownerId, JSON.stringify(a.scopes), a.createdAt, a.expiresAt, a.clientId, a.audience).run();
74
+ },
75
+ async get(id) {
76
+ const row = await q(`SELECT * FROM ${t.accessTokens} WHERE id = ?1`, id).first();
77
+ return row ? access(row) : null;
78
+ },
79
+ async getByHash(hash) {
80
+ const row = await q(`SELECT * FROM ${t.accessTokens} WHERE token_hash = ?1`, hash).first();
81
+ return row ? access(row) : null;
82
+ },
83
+ async listByOwner(ownerId) {
84
+ const rows = (await q(`SELECT * FROM ${t.accessTokens} WHERE owner_uid = ?1 ORDER BY created_at DESC`, ownerId).all()).results || [];
85
+ // Rows without a client_id predate OAuth-only access and can never be used again; hide them.
86
+ return rows.filter((row) => row.client_id).map(access);
87
+ },
88
+ async touch(id, usedAt) {
89
+ await q(`UPDATE ${t.accessTokens} SET last_used_at = ?1 WHERE id = ?2`, usedAt, id).run();
90
+ },
91
+ async revoke(id) {
92
+ return !!(await q(`UPDATE ${t.accessTokens} SET revoked = 1 WHERE id = ?1 AND revoked = 0`, id).run()).meta.changes;
93
+ },
94
+ },
95
+ async prune(now) {
96
+ await q(`DELETE FROM ${t.codes} WHERE expires_at < ?1`, now).run();
97
+ await q(`DELETE FROM ${t.refreshTokens} WHERE expires_at < ?1`, now).run();
98
+ },
99
+ async ensureSchema() {
100
+ await db.exec(`CREATE TABLE IF NOT EXISTS ${t.accessTokens} (id TEXT PRIMARY KEY, token_hash TEXT NOT NULL UNIQUE, token_prefix TEXT NOT NULL, name TEXT NOT NULL, owner_uid TEXT NOT NULL, scopes TEXT NOT NULL, created_at TEXT NOT NULL, expires_at TEXT, revoked INTEGER NOT NULL DEFAULT 0, last_used_at TEXT, client_id TEXT, audience TEXT);`);
101
+ await db.exec(`CREATE TABLE IF NOT EXISTS ${t.clients} (client_id TEXT PRIMARY KEY, client_secret_hash TEXT, client_name TEXT NOT NULL, redirect_uris TEXT NOT NULL, token_endpoint_auth_method TEXT NOT NULL, scope TEXT, created_at TEXT NOT NULL, last_used_at TEXT);`);
102
+ await db.exec(`CREATE TABLE IF NOT EXISTS ${t.codes} (code_hash TEXT PRIMARY KEY, client_id TEXT NOT NULL, owner_uid TEXT NOT NULL, redirect_uri TEXT NOT NULL, scopes TEXT NOT NULL, code_challenge TEXT NOT NULL, resource TEXT, expires_at TEXT NOT NULL, used_at TEXT, issued_token_id TEXT);`);
103
+ await db.exec(`CREATE TABLE IF NOT EXISTS ${t.refreshTokens} (token_hash TEXT PRIMARY KEY, client_id TEXT NOT NULL, owner_uid TEXT NOT NULL, access_token_id TEXT NOT NULL, scopes TEXT NOT NULL, expires_at TEXT NOT NULL, revoked INTEGER NOT NULL DEFAULT 0, successor_id TEXT);`);
104
+ },
105
+ };
106
+ }
107
+ //# sourceMappingURL=sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql.js","sourceRoot":"","sources":["../src/sql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ export interface ClientRecord {
2
+ id: string;
3
+ /** SHA-256 of the client secret, or null for public clients (`token_endpoint_auth_method: none`). */
4
+ secretHash: string | null;
5
+ name: string;
6
+ redirectUris: string[];
7
+ tokenEndpointAuthMethod: string;
8
+ /** Default scope string the client asked for at registration, if any. */
9
+ scope: string | null;
10
+ createdAt: string;
11
+ lastUsedAt: string | null;
12
+ }
13
+ export interface CodeRecord {
14
+ /** SHA-256 of the authorization code; the primary key. */
15
+ hash: string;
16
+ clientId: string;
17
+ ownerId: string;
18
+ redirectUri: string;
19
+ scopes: string[];
20
+ codeChallenge: string;
21
+ resource: string | null;
22
+ expiresAt: string;
23
+ usedAt: string | null;
24
+ /** Access token issued when the code was exchanged; used to revoke on replay. */
25
+ issuedTokenId: string | null;
26
+ }
27
+ export interface RefreshTokenRecord {
28
+ /** SHA-256 of the refresh token; the primary key. */
29
+ hash: string;
30
+ clientId: string;
31
+ ownerId: string;
32
+ /** The access token this refresh token was issued together with. Unique per record. */
33
+ accessTokenId: string;
34
+ scopes: string[];
35
+ expiresAt: string;
36
+ revoked: boolean;
37
+ /** Access token id of the pair that replaced this one after rotation. */
38
+ successorId: string | null;
39
+ }
40
+ export interface AccessTokenRecord {
41
+ id: string;
42
+ /** SHA-256 of the access token. Unique. */
43
+ hash: string;
44
+ /** First characters of the raw token, shown to users so they can recognise it. */
45
+ prefix: string;
46
+ clientId: string;
47
+ clientName: string;
48
+ ownerId: string;
49
+ scopes: string[];
50
+ audience: string;
51
+ createdAt: string;
52
+ expiresAt: string;
53
+ lastUsedAt: string | null;
54
+ revoked: boolean;
55
+ }
56
+ export interface AppServerStore {
57
+ clients: {
58
+ create(client: ClientRecord): Promise<void>;
59
+ get(clientId: string): Promise<ClientRecord | null>;
60
+ /** Record that the client obtained a token. */
61
+ touch(clientId: string, usedAt: string): Promise<void>;
62
+ };
63
+ codes: {
64
+ create(code: CodeRecord): Promise<void>;
65
+ get(hash: string): Promise<CodeRecord | null>;
66
+ /**
67
+ * Mark the code used **atomically**: return true only for the first caller; false if it was
68
+ * already consumed. Two concurrent exchanges of the same code must not both succeed.
69
+ */
70
+ consume(hash: string, usedAt: string): Promise<boolean>;
71
+ setIssuedToken(hash: string, accessTokenId: string): Promise<void>;
72
+ };
73
+ refreshTokens: {
74
+ create(token: RefreshTokenRecord): Promise<void>;
75
+ get(hash: string): Promise<RefreshTokenRecord | null>;
76
+ getByAccessToken(accessTokenId: string): Promise<RefreshTokenRecord | null>;
77
+ /**
78
+ * Mark the token revoked **atomically**: return true only if it was active. Refresh-token
79
+ * rotation relies on this so a replayed token cannot be redeemed twice.
80
+ */
81
+ revoke(hash: string): Promise<boolean>;
82
+ revokeByAccessToken(accessTokenId: string): Promise<void>;
83
+ setSuccessor(hash: string, accessTokenId: string): Promise<void>;
84
+ };
85
+ accessTokens: {
86
+ create(token: AccessTokenRecord): Promise<void>;
87
+ get(id: string): Promise<AccessTokenRecord | null>;
88
+ getByHash(hash: string): Promise<AccessTokenRecord | null>;
89
+ /** Newest first. */
90
+ listByOwner(ownerId: string): Promise<AccessTokenRecord[]>;
91
+ touch(id: string, usedAt: string): Promise<void>;
92
+ /** Return true if the token was active and is now revoked. */
93
+ revoke(id: string): Promise<boolean>;
94
+ };
95
+ /** Optional: delete codes and refresh tokens whose `expiresAt` is before `now`. Called opportunistically. */
96
+ prune?(now: string): Promise<void>;
97
+ /** Optional: idempotent setup (create tables, indexes…). Exposed as `mcp.ensureSchema()`. */
98
+ ensureSchema?(): Promise<void>;
99
+ }
100
+ /**
101
+ * Reference implementation backed by Maps. Suitable for tests, local development and
102
+ * single-process servers; state is lost on restart. Also the smallest correct example
103
+ * of the contract for anyone writing their own store.
104
+ */
105
+ export declare function memoryStore(): AppServerStore;
106
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
package/dist/store.js ADDED
@@ -0,0 +1,122 @@
1
+ // Storage contract. the server core never touches a database: everything it needs to remember
2
+ // (registered clients, authorization codes, refresh chains, access tokens) goes through this
3
+ // interface. Implement it over whatever you already run — SQL, KV, Redis, Mongo, an ORM.
4
+ //
5
+ // Records are plain objects. Secrets (codes, tokens, client secrets) arrive already hashed;
6
+ // the store never sees a raw credential. Timestamps are ISO-8601 strings and compare lexically.
7
+ /**
8
+ * Reference implementation backed by Maps. Suitable for tests, local development and
9
+ * single-process servers; state is lost on restart. Also the smallest correct example
10
+ * of the contract for anyone writing their own store.
11
+ */
12
+ export function memoryStore() {
13
+ const clients = new Map();
14
+ const codes = new Map();
15
+ const refresh = new Map();
16
+ const access = new Map();
17
+ const accessByHash = new Map();
18
+ const copy = (value) => (value ? { ...value } : null);
19
+ return {
20
+ clients: {
21
+ async create(client) {
22
+ clients.set(client.id, { ...client });
23
+ },
24
+ async get(id) {
25
+ return copy(clients.get(id));
26
+ },
27
+ async touch(id, usedAt) {
28
+ const row = clients.get(id);
29
+ if (row)
30
+ row.lastUsedAt = usedAt;
31
+ },
32
+ },
33
+ codes: {
34
+ async create(code) {
35
+ codes.set(code.hash, { ...code });
36
+ },
37
+ async get(hash) {
38
+ return copy(codes.get(hash));
39
+ },
40
+ async consume(hash, usedAt) {
41
+ const row = codes.get(hash);
42
+ if (!row || row.usedAt)
43
+ return false;
44
+ row.usedAt = usedAt;
45
+ return true;
46
+ },
47
+ async setIssuedToken(hash, id) {
48
+ const row = codes.get(hash);
49
+ if (row)
50
+ row.issuedTokenId = id;
51
+ },
52
+ },
53
+ refreshTokens: {
54
+ async create(token) {
55
+ refresh.set(token.hash, { ...token });
56
+ },
57
+ async get(hash) {
58
+ return copy(refresh.get(hash));
59
+ },
60
+ async getByAccessToken(id) {
61
+ for (const row of refresh.values())
62
+ if (row.accessTokenId === id)
63
+ return { ...row };
64
+ return null;
65
+ },
66
+ async revoke(hash) {
67
+ const row = refresh.get(hash);
68
+ if (!row || row.revoked)
69
+ return false;
70
+ row.revoked = true;
71
+ return true;
72
+ },
73
+ async revokeByAccessToken(id) {
74
+ for (const row of refresh.values())
75
+ if (row.accessTokenId === id)
76
+ row.revoked = true;
77
+ },
78
+ async setSuccessor(hash, id) {
79
+ const row = refresh.get(hash);
80
+ if (row)
81
+ row.successorId = id;
82
+ },
83
+ },
84
+ accessTokens: {
85
+ async create(token) {
86
+ access.set(token.id, { ...token });
87
+ accessByHash.set(token.hash, token.id);
88
+ },
89
+ async get(id) {
90
+ return copy(access.get(id));
91
+ },
92
+ async getByHash(hash) {
93
+ const id = accessByHash.get(hash);
94
+ return id ? copy(access.get(id)) : null;
95
+ },
96
+ async listByOwner(ownerId) {
97
+ return [...access.values()].filter((row) => row.ownerId === ownerId).sort((a, b) => (a.createdAt < b.createdAt ? 1 : -1)).map((row) => ({ ...row }));
98
+ },
99
+ async touch(id, usedAt) {
100
+ const row = access.get(id);
101
+ if (row)
102
+ row.lastUsedAt = usedAt;
103
+ },
104
+ async revoke(id) {
105
+ const row = access.get(id);
106
+ if (!row || row.revoked)
107
+ return false;
108
+ row.revoked = true;
109
+ return true;
110
+ },
111
+ },
112
+ async prune(now) {
113
+ for (const [hash, row] of codes)
114
+ if (row.expiresAt < now)
115
+ codes.delete(hash);
116
+ for (const [hash, row] of refresh)
117
+ if (row.expiresAt < now)
118
+ refresh.delete(hash);
119
+ },
120
+ };
121
+ }
122
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,6FAA6F;AAC7F,yFAAyF;AACzF,EAAE;AACF,4FAA4F;AAC5F,gGAAgG;AA0GhG;;;;GAIG;AACH,MAAM,UAAU,WAAW;IACzB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAwB,CAAC;IAChD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC5C,MAAM,OAAO,GAAG,IAAI,GAAG,EAA8B,CAAC;IACtD,MAAM,MAAM,GAAG,IAAI,GAAG,EAA6B,CAAC;IACpD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC/C,MAAM,IAAI,GAAG,CAAI,KAAoB,EAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAClF,OAAO;QACL,OAAO,EAAE;YACP,KAAK,CAAC,MAAM,CAAC,MAAM;gBACjB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;YACxC,CAAC;YACD,KAAK,CAAC,GAAG,CAAC,EAAE;gBACV,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/B,CAAC;YACD,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM;gBACpB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC5B,IAAI,GAAG;oBAAE,GAAG,CAAC,UAAU,GAAG,MAAM,CAAC;YACnC,CAAC;SACF;QACD,KAAK,EAAE;YACL,KAAK,CAAC,MAAM,CAAC,IAAI;gBACf,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;YACpC,CAAC;YACD,KAAK,CAAC,GAAG,CAAC,IAAI;gBACZ,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YAC/B,CAAC;YACD,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM;gBACxB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC5B,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM;oBAAE,OAAO,KAAK,CAAC;gBACrC,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC;gBACpB,OAAO,IAAI,CAAC;YACd,CAAC;YACD,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,EAAE;gBAC3B,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC5B,IAAI,GAAG;oBAAE,GAAG,CAAC,aAAa,GAAG,EAAE,CAAC;YAClC,CAAC;SACF;QACD,aAAa,EAAE;YACb,KAAK,CAAC,MAAM,CAAC,KAAK;gBAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;YACxC,CAAC;YACD,KAAK,CAAC,GAAG,CAAC,IAAI;gBACZ,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YACjC,CAAC;YACD,KAAK,CAAC,gBAAgB,CAAC,EAAE;gBACvB,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,MAAM,EAAE;oBAAE,IAAI,GAAG,CAAC,aAAa,KAAK,EAAE;wBAAE,OAAO,EAAE,GAAG,GAAG,EAAE,CAAC;gBACpF,OAAO,IAAI,CAAC;YACd,CAAC;YACD,KAAK,CAAC,MAAM,CAAC,IAAI;gBACf,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC9B,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO;oBAAE,OAAO,KAAK,CAAC;gBACtC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;gBACnB,OAAO,IAAI,CAAC;YACd,CAAC;YACD,KAAK,CAAC,mBAAmB,CAAC,EAAE;gBAC1B,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,MAAM,EAAE;oBAAE,IAAI,GAAG,CAAC,aAAa,KAAK,EAAE;wBAAE,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;YACvF,CAAC;YACD,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE;gBACzB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC9B,IAAI,GAAG;oBAAE,GAAG,CAAC,WAAW,GAAG,EAAE,CAAC;YAChC,CAAC;SACF;QACD,YAAY,EAAE;YACZ,KAAK,CAAC,MAAM,CAAC,KAAK;gBAChB,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;gBACnC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;YACzC,CAAC;YACD,KAAK,CAAC,GAAG,CAAC,EAAE;gBACV,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9B,CAAC;YACD,KAAK,CAAC,SAAS,CAAC,IAAI;gBAClB,MAAM,EAAE,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAClC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC1C,CAAC;YACD,KAAK,CAAC,WAAW,CAAC,OAAO;gBACvB,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;YACvJ,CAAC;YACD,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM;gBACpB,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC3B,IAAI,GAAG;oBAAE,GAAG,CAAC,UAAU,GAAG,MAAM,CAAC;YACnC,CAAC;YACD,KAAK,CAAC,MAAM,CAAC,EAAE;gBACb,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC3B,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO;oBAAE,OAAO,KAAK,CAAC;gBACtC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;gBACnB,OAAO,IAAI,CAAC;YACd,CAAC;SACF;QACD,KAAK,CAAC,KAAK,CAAC,GAAG;YACb,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,KAAK;gBAAE,IAAI,GAAG,CAAC,SAAS,GAAG,GAAG;oBAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC7E,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,OAAO;gBAAE,IAAI,GAAG,CAAC,SAAS,GAAG,GAAG;oBAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACnF,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { AuthenticatedGrant, Grant } from './types.js';
2
+ import type { AppServerStore } from './store.js';
3
+ export interface TokenStore {
4
+ issue(input: {
5
+ ownerId: string;
6
+ clientId: string;
7
+ clientName: string;
8
+ scopes: string[];
9
+ audience: string;
10
+ }): Promise<{
11
+ id: string;
12
+ token: string;
13
+ expiresAt: string;
14
+ }>;
15
+ verify(token: string, audience: string): Promise<AuthenticatedGrant>;
16
+ /** Returns the token's identity when it was active and is now revoked; null otherwise. */
17
+ revoke(id: string): Promise<{
18
+ ownerId: string;
19
+ clientId: string;
20
+ clientName: string;
21
+ } | null>;
22
+ list(ownerId: string): Promise<Grant[]>;
23
+ owns(ownerId: string, id: string): Promise<boolean>;
24
+ }
25
+ export declare function createTokenStore(store: AppServerStore, prefix: string, ttlDays: number, allowedScopes: readonly string[]): TokenStore;
26
+ //# sourceMappingURL=tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAE5D,OAAO,KAAK,EAAqB,cAAc,EAAE,MAAM,YAAY,CAAC;AAGpE,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvK,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACrE,0FAA0F;IAC1F,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IAC9F,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACxC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACrD;AAoBD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU,CAmCrI"}
package/dist/tokens.js ADDED
@@ -0,0 +1,61 @@
1
+ import { AppServerError } from './types.js';
2
+ import { nowIso, sha256Hex } from './util.js';
3
+ function randomToken(prefix) {
4
+ return prefix + crypto.randomUUID().replace(/-/g, '') + crypto.randomUUID().replace(/-/g, '');
5
+ }
6
+ const toGrant = (row) => ({
7
+ id: row.id,
8
+ name: row.clientName,
9
+ ownerId: row.ownerId,
10
+ scopes: row.scopes,
11
+ clientId: row.clientId,
12
+ createdAt: row.createdAt,
13
+ expiresAt: row.expiresAt,
14
+ lastUsedAt: row.lastUsedAt || '',
15
+ revoked: row.revoked,
16
+ expired: !!row.expiresAt && row.expiresAt < nowIso(),
17
+ prefix: row.prefix,
18
+ });
19
+ export function createTokenStore(store, prefix, ttlDays, allowedScopes) {
20
+ const tokens = store.accessTokens;
21
+ return {
22
+ async issue(input) {
23
+ const scopes = input.scopes.filter((scope) => allowedScopes.includes(scope));
24
+ if (!scopes.length)
25
+ throw new AppServerError(400, 'Invalid token scopes');
26
+ const raw = randomToken(prefix);
27
+ const id = crypto.randomUUID();
28
+ const expiresAt = new Date(Date.now() + ttlDays * 86400 * 1000).toISOString();
29
+ await tokens.create({ id, hash: await sha256Hex(raw), prefix: raw.slice(0, 8), clientId: input.clientId, clientName: input.clientName.slice(0, 200), ownerId: input.ownerId, scopes, audience: input.audience, createdAt: nowIso(), expiresAt, lastUsedAt: null, revoked: false });
30
+ return { id, token: raw, expiresAt };
31
+ },
32
+ async verify(token, audience) {
33
+ const row = await tokens.getByHash(await sha256Hex(token));
34
+ if (!row)
35
+ throw new AppServerError(401, 'Invalid agent token');
36
+ if (row.revoked)
37
+ throw new AppServerError(401, 'Agent token revoked');
38
+ if (row.expiresAt && row.expiresAt < nowIso())
39
+ throw new AppServerError(401, 'Agent token expired');
40
+ if (row.audience !== audience)
41
+ throw new AppServerError(401, 'Agent token audience mismatch; authorize again');
42
+ await tokens.touch(row.id, nowIso());
43
+ return { grantId: row.id, ownerId: row.ownerId, scopes: row.scopes, clientId: row.clientId, clientName: row.clientName, audience };
44
+ },
45
+ async revoke(id) {
46
+ const row = await tokens.get(id);
47
+ if (!row)
48
+ return null;
49
+ const changed = await tokens.revoke(id);
50
+ return changed ? { ownerId: row.ownerId, clientId: row.clientId, clientName: row.clientName } : null;
51
+ },
52
+ async list(ownerId) {
53
+ return (await tokens.listByOwner(ownerId)).map(toGrant);
54
+ },
55
+ async owns(ownerId, id) {
56
+ const row = await tokens.get(id);
57
+ return !!row && row.ownerId === ownerId;
58
+ },
59
+ };
60
+ }
61
+ //# sourceMappingURL=tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,152 @@
1
+ import type { ZodRawShape } from 'zod';
2
+ import type { AppServerStore } from './store.js';
3
+ import type { RateLimitConfig } from './rate-limit.js';
4
+ /** The user the host app recognizes on the consent page. `id` must be stable and never reused. */
5
+ export interface Identity {
6
+ id: string;
7
+ displayName?: string;
8
+ email?: string;
9
+ }
10
+ /**
11
+ * The only contract between the host app and the server: given the consent-page request
12
+ * (whatever credential the host's own login puts on it), say who the current user is.
13
+ * Throw `AppServerError(401, …)` when nobody is signed in.
14
+ */
15
+ export interface IdentityProvider {
16
+ resolve(request: Request): Promise<Identity>;
17
+ }
18
+ export interface ScopeDefinition {
19
+ /** Human-readable meaning shown on the consent page. */
20
+ description: string;
21
+ /** Always granted; the consent page cannot uncheck it (typically the read scope). */
22
+ required?: boolean;
23
+ /** Pre-checked on the consent page. Required scopes are always on. */
24
+ default?: boolean;
25
+ }
26
+ export interface ToolAnnotations {
27
+ readOnlyHint: boolean;
28
+ destructiveHint?: boolean;
29
+ idempotentHint?: boolean;
30
+ openWorldHint: boolean;
31
+ }
32
+ export interface ToolResult {
33
+ content: {
34
+ type: 'text';
35
+ text: string;
36
+ }[];
37
+ isError?: boolean;
38
+ }
39
+ /** Everything a tool handler may know about the caller. Nothing here comes from tool input. */
40
+ export interface ToolContext {
41
+ ownerId: string;
42
+ scopes: string[];
43
+ grantId: string;
44
+ clientId: string;
45
+ clientName: string;
46
+ /** The MCP request; hosts that route tools through their own REST API can forward its Authorization header. */
47
+ request: Request;
48
+ }
49
+ export interface AgentTool {
50
+ name: string;
51
+ /** Scope required to see and call the tool; omit for tools any authorized agent may use. */
52
+ scope?: string;
53
+ description: string;
54
+ inputSchema: ZodRawShape;
55
+ annotations: ToolAnnotations;
56
+ handler: (args: Record<string, unknown>, ctx: ToolContext) => Promise<ToolResult>;
57
+ }
58
+ export interface Origins {
59
+ /** Where agents reach the server; written into metadata, `resource` and token audience. */
60
+ publicOrigin: string;
61
+ /** Where the consent page lives (may differ from publicOrigin during local development). */
62
+ webOrigin: string;
63
+ }
64
+ export type AppServerEvent = {
65
+ type: 'authorized' | 'refreshed' | 'revoked';
66
+ ownerId: string;
67
+ grantId: string;
68
+ clientId: string;
69
+ clientName: string;
70
+ scopes?: string[];
71
+ } | {
72
+ type: 'tool';
73
+ ownerId: string;
74
+ grantId: string;
75
+ clientId: string;
76
+ clientName: string;
77
+ tool: string;
78
+ ok: boolean;
79
+ };
80
+ export interface Grant {
81
+ id: string;
82
+ name: string;
83
+ ownerId: string;
84
+ scopes: string[];
85
+ clientId: string;
86
+ createdAt: string;
87
+ expiresAt: string;
88
+ lastUsedAt: string;
89
+ revoked: boolean;
90
+ expired: boolean;
91
+ prefix: string;
92
+ }
93
+ /** Result of verifying an agent access token on any request (MCP or the host's own API). */
94
+ export interface AuthenticatedGrant {
95
+ grantId: string;
96
+ ownerId: string;
97
+ scopes: string[];
98
+ clientId: string;
99
+ clientName: string;
100
+ audience: string;
101
+ }
102
+ export interface McpAppServerConfig {
103
+ /** MCP server name; also used in server.json. */
104
+ name: string;
105
+ version?: string;
106
+ /** All server routes hang here: `<basePath>/mcp`, `<basePath>/mcp/schema`, `<basePath>/oauth/*`. */
107
+ basePath: string;
108
+ /** Path on `webOrigin` that renders the consent page. Default `/oauth/authorize`. */
109
+ consentPath?: string;
110
+ /**
111
+ * Ordered scope catalogue; order is preserved in metadata and on the consent page. Optional:
112
+ * omit it when your app has no notion of delegated scopes — the server then uses one implicit
113
+ * required scope named after the server, the consent page is a plain allow/deny, and every
114
+ * tool is visible to every authorized agent. Authorization stays entirely in your handlers.
115
+ */
116
+ scopes?: Record<string, ScopeDefinition>;
117
+ identity: IdentityProvider;
118
+ tools: readonly AgentTool[];
119
+ /**
120
+ * Where clients, codes and tokens live. Implement `AppServerStore` over your own database, or use
121
+ * `memoryStore()` (dev/tests) or `sqlStore()` from `@ninomae/mcp-app-server/sql` (D1, SQLite).
122
+ */
123
+ storage: AppServerStore;
124
+ /** Static origins or derived per request (e.g. from Host + env). */
125
+ origins: Origins | ((request: Request) => Origins);
126
+ /** Access token lifetime in days (default 30) and refresh token lifetime (default 90). */
127
+ accessTokenDays?: number;
128
+ refreshTokenDays?: number;
129
+ /** Prefix for issued access tokens; lets the host recognize them on its own routes. Default `agt_`. */
130
+ tokenPrefix?: string;
131
+ /**
132
+ * Rate limit for `POST <base>/oauth/register`, the one unauthenticated endpoint that writes.
133
+ * Default: `memoryRateLimiter()` (20 per hour per IP, per process). Pass your platform's shared
134
+ * counter on multi-instance runtimes, or `false` to disable.
135
+ */
136
+ registrationLimit?: RateLimitConfig | false;
137
+ /** Audit hook. Never receives tool payloads. */
138
+ onEvent?: (event: AppServerEvent) => Promise<void> | void;
139
+ /** Let `initialize` / `tools/list` answer without a token so registries can inspect the server. Default true. */
140
+ anonymousDiscovery?: boolean;
141
+ /** Optional free-text contract (markdown) published with the schema and via a `*_get_contract`-style tool if the host wants one. */
142
+ contract?: string;
143
+ }
144
+ export declare class AppServerError extends Error {
145
+ status: number;
146
+ /** OAuth error code when the failure is reported through an OAuth response. */
147
+ code: string;
148
+ constructor(status: number, message: string,
149
+ /** OAuth error code when the failure is reported through an OAuth response. */
150
+ code?: string);
151
+ }
152
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,13 @@
1
+ export class AppServerError extends Error {
2
+ status;
3
+ code;
4
+ constructor(status, message,
5
+ /** OAuth error code when the failure is reported through an OAuth response. */
6
+ code = status === 401 ? 'invalid_token' : 'invalid_request') {
7
+ super(message);
8
+ this.status = status;
9
+ this.code = code;
10
+ this.name = 'AppServerError';
11
+ }
12
+ }
13
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AA4IA,MAAM,OAAO,cAAe,SAAQ,KAAK;IAE9B;IAGA;IAJT,YACS,MAAc,EACrB,OAAe;IACf,+EAA+E;IACxE,OAAe,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,iBAAiB;QAE1E,KAAK,CAAC,OAAO,CAAC,CAAC;QALR,WAAM,GAAN,MAAM,CAAQ;QAGd,SAAI,GAAJ,IAAI,CAA+D;QAG1E,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF"}