@nocoo/base-mcp 0.1.0 → 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.
Files changed (46) hide show
  1. package/README.md +315 -3
  2. package/dist/auth/index.d.ts +1 -0
  3. package/dist/auth/index.d.ts.map +1 -1
  4. package/dist/auth/index.js +2 -0
  5. package/dist/auth/index.js.map +1 -1
  6. package/dist/auth/oauth/constants.d.ts +7 -0
  7. package/dist/auth/oauth/constants.d.ts.map +1 -0
  8. package/dist/auth/oauth/constants.js +10 -0
  9. package/dist/auth/oauth/constants.js.map +1 -0
  10. package/dist/auth/oauth/handlers/authorize.d.ts +12 -0
  11. package/dist/auth/oauth/handlers/authorize.d.ts.map +1 -0
  12. package/dist/auth/oauth/handlers/authorize.js +89 -0
  13. package/dist/auth/oauth/handlers/authorize.js.map +1 -0
  14. package/dist/auth/oauth/handlers/callback.d.ts +13 -0
  15. package/dist/auth/oauth/handlers/callback.d.ts.map +1 -0
  16. package/dist/auth/oauth/handlers/callback.js +72 -0
  17. package/dist/auth/oauth/handlers/callback.js.map +1 -0
  18. package/dist/auth/oauth/handlers/index.d.ts +5 -0
  19. package/dist/auth/oauth/handlers/index.d.ts.map +1 -0
  20. package/dist/auth/oauth/handlers/index.js +8 -0
  21. package/dist/auth/oauth/handlers/index.js.map +1 -0
  22. package/dist/auth/oauth/handlers/register.d.ts +9 -0
  23. package/dist/auth/oauth/handlers/register.d.ts.map +1 -0
  24. package/dist/auth/oauth/handlers/register.js +62 -0
  25. package/dist/auth/oauth/handlers/register.js.map +1 -0
  26. package/dist/auth/oauth/handlers/token.d.ts +10 -0
  27. package/dist/auth/oauth/handlers/token.d.ts.map +1 -0
  28. package/dist/auth/oauth/handlers/token.js +139 -0
  29. package/dist/auth/oauth/handlers/token.js.map +1 -0
  30. package/dist/auth/oauth/index.d.ts +4 -0
  31. package/dist/auth/oauth/index.d.ts.map +1 -0
  32. package/dist/auth/oauth/index.js +8 -0
  33. package/dist/auth/oauth/index.js.map +1 -0
  34. package/dist/auth/oauth/testing/index.d.ts +2 -0
  35. package/dist/auth/oauth/testing/index.d.ts.map +1 -0
  36. package/dist/auth/oauth/testing/index.js +5 -0
  37. package/dist/auth/oauth/testing/index.js.map +1 -0
  38. package/dist/auth/oauth/testing/mock-stores.d.ts +36 -0
  39. package/dist/auth/oauth/testing/mock-stores.d.ts.map +1 -0
  40. package/dist/auth/oauth/testing/mock-stores.js +218 -0
  41. package/dist/auth/oauth/testing/mock-stores.js.map +1 -0
  42. package/dist/auth/oauth/types.d.ts +187 -0
  43. package/dist/auth/oauth/types.d.ts.map +1 -0
  44. package/dist/auth/oauth/types.js +5 -0
  45. package/dist/auth/oauth/types.js.map +1 -0
  46. package/package.json +12 -10
@@ -0,0 +1,187 @@
1
+ /** MCP OAuth client record */
2
+ export interface McpClient {
3
+ id: string;
4
+ client_id: string;
5
+ client_name: string;
6
+ redirect_uris: string;
7
+ grant_types: string;
8
+ created_at: number;
9
+ }
10
+ /** MCP OAuth authorization session/code record */
11
+ export interface McpAuthCode {
12
+ state: string;
13
+ client_id: string;
14
+ redirect_uri: string;
15
+ code_challenge: string;
16
+ code_challenge_method: string;
17
+ scope: string;
18
+ code: string | null;
19
+ user_email: string | null;
20
+ consumed: number;
21
+ expires_at: number;
22
+ }
23
+ /** MCP OAuth token record */
24
+ export interface McpToken {
25
+ id: string;
26
+ access_token_hash: string;
27
+ access_token_preview: string;
28
+ refresh_token_hash: string;
29
+ client_id: string;
30
+ user_email: string;
31
+ client_name: string | null;
32
+ scope: string;
33
+ revoked: number;
34
+ revoked_at: number | null;
35
+ expires_at: number;
36
+ refresh_expires_at: number;
37
+ last_used_at: number | null;
38
+ created_at: number;
39
+ }
40
+ /** Client store interface */
41
+ export interface ClientStore {
42
+ create(input: {
43
+ client_name: string;
44
+ redirect_uris: string[];
45
+ grant_types: string[];
46
+ }): Promise<McpClient>;
47
+ findByClientId(clientId: string): Promise<McpClient | null>;
48
+ }
49
+ /** Auth session/code store interface */
50
+ export interface AuthCodeStore {
51
+ createSession(input: {
52
+ state: string;
53
+ client_id: string;
54
+ redirect_uri: string;
55
+ code_challenge: string;
56
+ code_challenge_method: string;
57
+ scope: string;
58
+ expires_at: number;
59
+ }): Promise<void>;
60
+ findByState(state: string): Promise<McpAuthCode | null>;
61
+ upgrade(state: string, code: string, userEmail: string, expiresAt: number): Promise<boolean>;
62
+ findByCode(code: string): Promise<McpAuthCode | null>;
63
+ consume(code: string): Promise<boolean>;
64
+ }
65
+ /** Token store interface for OAuth handlers */
66
+ export interface OAuthTokenStore {
67
+ create(input: {
68
+ access_token_hash: string;
69
+ access_token_preview: string;
70
+ refresh_token_hash: string;
71
+ client_id: string;
72
+ user_email: string;
73
+ scope: string;
74
+ client_name?: string;
75
+ expires_at: number;
76
+ refresh_expires_at: number;
77
+ }): Promise<McpToken>;
78
+ findByRefreshHash(refreshHash: string): Promise<McpToken | null>;
79
+ revokeByClientAndUser(clientId: string, userEmail: string): Promise<number>;
80
+ }
81
+ export interface AuthContext {
82
+ /** Check if user is authenticated */
83
+ isAuthenticated(): Promise<boolean>;
84
+ /** Get authenticated user's email (null if not authenticated) */
85
+ getEmail(): Promise<string | null>;
86
+ /** Check if email is allowed (whitelist) */
87
+ isEmailAllowed(email: string): boolean;
88
+ }
89
+ export interface OAuthContext {
90
+ clients: ClientStore;
91
+ authCodes: AuthCodeStore;
92
+ tokens: OAuthTokenStore;
93
+ auth: AuthContext;
94
+ /** The issuer URL (e.g., "https://myapp.com") */
95
+ issuer: string;
96
+ /** Token prefix (e.g., "myapp" -> "myapp_at_xxx") */
97
+ tokenPrefix: string;
98
+ }
99
+ /** Register handler result */
100
+ export type RegisterResult = {
101
+ success: true;
102
+ status: 201;
103
+ body: {
104
+ client_id: string;
105
+ client_name: string;
106
+ redirect_uris: string[];
107
+ grant_types: string[];
108
+ token_endpoint_auth_method: "none";
109
+ };
110
+ } | {
111
+ success: false;
112
+ status: number;
113
+ error: string;
114
+ };
115
+ /** Authorize handler result */
116
+ export type AuthorizeResult = {
117
+ action: "redirect_to_callback";
118
+ url: string;
119
+ } | {
120
+ action: "redirect_to_login";
121
+ loginUrl: string;
122
+ } | {
123
+ action: "error";
124
+ error: string;
125
+ status: number;
126
+ };
127
+ /** Callback handler result */
128
+ export type CallbackResult = {
129
+ action: "redirect_to_client";
130
+ url: string;
131
+ } | {
132
+ action: "error";
133
+ error: string;
134
+ status: number;
135
+ };
136
+ /** Token handler result */
137
+ export type TokenResult = {
138
+ success: true;
139
+ status: 200;
140
+ body: {
141
+ access_token: string;
142
+ token_type: "Bearer";
143
+ expires_in: number;
144
+ refresh_token: string;
145
+ scope: string;
146
+ };
147
+ } | {
148
+ success: false;
149
+ status: number;
150
+ error: string;
151
+ error_description: string;
152
+ };
153
+ /** Revoke handler result */
154
+ export type RevokeResult = {
155
+ success: true;
156
+ status: 200;
157
+ } | {
158
+ success: false;
159
+ status: number;
160
+ error: string;
161
+ };
162
+ export interface RegisterInput {
163
+ client_name?: string;
164
+ redirect_uris?: string[];
165
+ grant_types?: string[];
166
+ }
167
+ export interface AuthorizeInput {
168
+ response_type: string | null;
169
+ client_id: string | null;
170
+ redirect_uri: string | null;
171
+ code_challenge: string | null;
172
+ code_challenge_method: string | null;
173
+ state: string | null;
174
+ scope?: string | null;
175
+ }
176
+ export interface CallbackInput {
177
+ state: string | null;
178
+ }
179
+ export interface TokenInput {
180
+ grant_type: string | null;
181
+ code?: string | null;
182
+ redirect_uri?: string | null;
183
+ client_id?: string | null;
184
+ code_verifier?: string | null;
185
+ refresh_token?: string | null;
186
+ }
187
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/auth/oauth/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ // ---------------------------------------------------------------------------
2
+ // OAuth Handler Types and Interfaces
3
+ // ---------------------------------------------------------------------------
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/auth/oauth/types.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,qCAAqC;AACrC,8EAA8E"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nocoo/base-mcp",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "MCP Server development framework with OAuth 2.1, Entity-Driven CRUD, and Streamable HTTP transport",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -28,6 +28,15 @@
28
28
  "dist",
29
29
  "README.md"
30
30
  ],
31
+ "scripts": {
32
+ "build": "tsc",
33
+ "test": "vitest run",
34
+ "test:watch": "vitest",
35
+ "test:coverage": "vitest run --coverage",
36
+ "lint": "eslint src",
37
+ "typecheck": "tsc --noEmit",
38
+ "prepublishOnly": "pnpm build"
39
+ },
31
40
  "keywords": [
32
41
  "mcp",
33
42
  "model-context-protocol",
@@ -59,12 +68,5 @@
59
68
  "@eslint/js": "^9.0.0",
60
69
  "typescript-eslint": "^8.0.0"
61
70
  },
62
- "scripts": {
63
- "build": "tsc",
64
- "test": "vitest run",
65
- "test:watch": "vitest",
66
- "test:coverage": "vitest run --coverage",
67
- "lint": "eslint src",
68
- "typecheck": "tsc --noEmit"
69
- }
70
- }
71
+ "packageManager": "pnpm@10.33.0"
72
+ }