gitx.do 0.1.2 → 0.1.3

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/dist/index.d.ts CHANGED
@@ -25,4 +25,5 @@ export * from '@dotdo/gitx';
25
25
  export { SchemaManager, SCHEMA_VERSION, SCHEMA_SQL, type DurableObjectStorage, } from './do/schema';
26
26
  export { type DOState, type DOStorage, type ServiceBinding, type DONamespaceBinding, type DOStub, type R2Binding, type R2Object, type KVBinding, type PipelineBinding, type BaseEnv, type GitRepoDOEnv, type InitializeOptions, type ForkOptions, type ForkResult, type CompactResult, type WorkflowContext, type StoreAccessor, type TypedStoreAccessor, type FsCapability, GitRepoDOErrorCode, GitRepoDOError, LogLevel, type LogEntry, type Logger, type HealthCheckResponse, } from './do/types';
27
27
  export { createLogger, createChildLogger, noopLogger, type LoggerOptions, } from './do/logger';
28
+ export { type McpToolResult, type McpToolSchema, type McpToolHandler, type McpTool, type ToolRegistry, type ToolContext, type ToolMiddleware, type InvokeToolOptions, registerTool, unregisterTool, invokeTool, getToolRegistry, clearToolRegistry, useMiddleware, clearMiddleware, gitTools, gitStatusToolSchema, gitLogToolSchema, gitDiffToolSchema, gitShowToolSchema, gitCommitToolSchema, gitBranchToolSchema, gitCheckoutToolSchema, gitAddToolSchema, gitResetToolSchema, gitMergeToolSchema, gitRebaseToolSchema, gitStashToolSchema, gitTagToolSchema, gitRemoteToolSchema, gitFetchToolSchema, gitPushToolSchema, gitPullToolSchema, gitCloneToolSchema, gitInitToolSchema, gitBlameToolSchema, gitAuthMiddleware, requireGitAuth, requireGitWrite, requireGitAdmin, type GitAuthContext, type GitAuthConfig, createGitMCPServer, type GitMCPServerOptions, } from './mcp/index';
28
29
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAMH,cAAc,aAAa,CAAA;AAM3B,OAAO,EACL,aAAa,EACb,cAAc,EACd,UAAU,EACV,KAAK,oBAAoB,GAC1B,MAAM,aAAa,CAAA;AAMpB,OAAO,EAEL,KAAK,OAAO,EACZ,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,MAAM,EAGX,KAAK,SAAS,EACd,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,OAAO,EACZ,KAAK,YAAY,EAGjB,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,aAAa,EAGlB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EAGvB,KAAK,YAAY,EAGjB,kBAAkB,EAClB,cAAc,EAGd,QAAQ,EACR,KAAK,QAAQ,EACb,KAAK,MAAM,EAGX,KAAK,mBAAmB,GACzB,MAAM,YAAY,CAAA;AAMnB,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,UAAU,EACV,KAAK,aAAa,GACnB,MAAM,aAAa,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAMH,cAAc,aAAa,CAAA;AAM3B,OAAO,EACL,aAAa,EACb,cAAc,EACd,UAAU,EACV,KAAK,oBAAoB,GAC1B,MAAM,aAAa,CAAA;AAMpB,OAAO,EAEL,KAAK,OAAO,EACZ,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,MAAM,EAGX,KAAK,SAAS,EACd,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,OAAO,EACZ,KAAK,YAAY,EAGjB,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,aAAa,EAGlB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EAGvB,KAAK,YAAY,EAGjB,kBAAkB,EAClB,cAAc,EAGd,QAAQ,EACR,KAAK,QAAQ,EACb,KAAK,MAAM,EAGX,KAAK,mBAAmB,GACzB,MAAM,YAAY,CAAA;AAMnB,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,UAAU,EACV,KAAK,aAAa,GACnB,MAAM,aAAa,CAAA;AAMpB,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,OAAO,EACZ,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,YAAY,EACZ,cAAc,EACd,UAAU,EACV,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,eAAe,EAEf,QAAQ,EACR,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAElB,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,eAAe,EACf,KAAK,cAAc,EACnB,KAAK,aAAa,EAElB,kBAAkB,EAClB,KAAK,mBAAmB,GACzB,MAAM,aAAa,CAAA"}
package/dist/index.js CHANGED
@@ -42,6 +42,16 @@ LogLevel, } from './do/types';
42
42
  // =============================================================================
43
43
  export { createLogger, createChildLogger, noopLogger, } from './do/logger';
44
44
  // =============================================================================
45
+ // MCP Server
46
+ // =============================================================================
47
+ export { registerTool, unregisterTool, invokeTool, getToolRegistry, clearToolRegistry, useMiddleware, clearMiddleware,
48
+ // Git tools
49
+ gitTools, gitStatusToolSchema, gitLogToolSchema, gitDiffToolSchema, gitShowToolSchema, gitCommitToolSchema, gitBranchToolSchema, gitCheckoutToolSchema, gitAddToolSchema, gitResetToolSchema, gitMergeToolSchema, gitRebaseToolSchema, gitStashToolSchema, gitTagToolSchema, gitRemoteToolSchema, gitFetchToolSchema, gitPushToolSchema, gitPullToolSchema, gitCloneToolSchema, gitInitToolSchema, gitBlameToolSchema,
50
+ // Auth
51
+ gitAuthMiddleware, requireGitAuth, requireGitWrite, requireGitAdmin,
52
+ // Server
53
+ createGitMCPServer, } from './mcp/index';
54
+ // =============================================================================
45
55
  // TODO: Additional exports to be added as migration continues
46
56
  // =============================================================================
47
57
  // - GitRepoDO
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,gFAAgF;AAChF,4CAA4C;AAC5C,gFAAgF;AAEhF,cAAc,aAAa,CAAA;AAE3B,gFAAgF;AAChF,wCAAwC;AACxC,gFAAgF;AAEhF,OAAO,EACL,aAAa,EACb,cAAc,EACd,UAAU,GAEX,MAAM,aAAa,CAAA;AAEpB,gFAAgF;AAChF,4BAA4B;AAC5B,gFAAgF;AAEhF,OAAO;AA8BL,cAAc;AACd,kBAAkB,EAClB,cAAc;AAEd,gBAAgB;AAChB,QAAQ,GAMT,MAAM,YAAY,CAAA;AAEnB,gFAAgF;AAChF,mBAAmB;AACnB,gFAAgF;AAEhF,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,UAAU,GAEX,MAAM,aAAa,CAAA;AAEpB,gFAAgF;AAChF,8DAA8D;AAC9D,gFAAgF;AAChF,cAAc;AACd,cAAc;AACd,aAAa;AACb,2BAA2B;AAC3B,kBAAkB;AAClB,gBAAgB;AAChB,QAAQ;AACR,uBAAuB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,gFAAgF;AAChF,4CAA4C;AAC5C,gFAAgF;AAEhF,cAAc,aAAa,CAAA;AAE3B,gFAAgF;AAChF,wCAAwC;AACxC,gFAAgF;AAEhF,OAAO,EACL,aAAa,EACb,cAAc,EACd,UAAU,GAEX,MAAM,aAAa,CAAA;AAEpB,gFAAgF;AAChF,4BAA4B;AAC5B,gFAAgF;AAEhF,OAAO;AA8BL,cAAc;AACd,kBAAkB,EAClB,cAAc;AAEd,gBAAgB;AAChB,QAAQ,GAMT,MAAM,YAAY,CAAA;AAEnB,gFAAgF;AAChF,mBAAmB;AACnB,gFAAgF;AAEhF,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,UAAU,GAEX,MAAM,aAAa,CAAA;AAEpB,gFAAgF;AAChF,aAAa;AACb,gFAAgF;AAEhF,OAAO,EAUL,YAAY,EACZ,cAAc,EACd,UAAU,EACV,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,eAAe;AACf,YAAY;AACZ,QAAQ,EACR,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB;AAClB,OAAO;AACP,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,eAAe;AAGf,SAAS;AACT,kBAAkB,GAEnB,MAAM,aAAa,CAAA;AAEpB,gFAAgF;AAChF,8DAA8D;AAC9D,gFAAgF;AAChF,cAAc;AACd,cAAc;AACd,aAAa;AACb,2BAA2B;AAC3B,kBAAkB;AAClB,gBAAgB;AAChB,QAAQ;AACR,uBAAuB"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Git MCP Authentication Middleware
3
+ *
4
+ * Provides OAuth 2.1 authentication via oauth.do for MCP git operations.
5
+ * Implements token introspection (RFC 7662) for access control.
6
+ *
7
+ * ## Authentication Flow
8
+ *
9
+ * 1. MCP client sends request with Bearer token
10
+ * 2. Middleware introspects token via oauth.do
11
+ * 3. Scopes determine access level:
12
+ * - `read` or `git:read` - read-only access
13
+ * - `write` or `git:write` - full access
14
+ * - `admin` or `git:admin` - admin access
15
+ *
16
+ * ## Usage with Hono
17
+ *
18
+ * ```typescript
19
+ * import { Hono } from 'hono'
20
+ * import { gitAuthMiddleware, requireGitWrite } from 'gitx.do/mcp'
21
+ *
22
+ * const app = new Hono()
23
+ *
24
+ * // Apply auth middleware to all routes
25
+ * app.use('/*', gitAuthMiddleware({
26
+ * introspectionUrl: 'https://oauth.do/introspect',
27
+ * clientId: env.OAUTH_CLIENT_ID,
28
+ * clientSecret: env.OAUTH_CLIENT_SECRET,
29
+ * }))
30
+ *
31
+ * // Protect write operations
32
+ * app.post('/git/commit', requireGitWrite(), async (c) => {
33
+ * const auth = c.get('gitAuth')
34
+ * // ...
35
+ * })
36
+ * ```
37
+ *
38
+ * @module mcp/auth
39
+ */
40
+ import type { MiddlewareHandler } from 'hono';
41
+ import type { GitAuthContext, GitAuthConfig } from './types';
42
+ export type { GitAuthContext, GitAuthConfig } from './types';
43
+ /**
44
+ * Extend Hono's ContextVariableMap with gitAuth
45
+ */
46
+ declare module 'hono' {
47
+ interface ContextVariableMap {
48
+ gitAuth: GitAuthContext;
49
+ }
50
+ }
51
+ /**
52
+ * Create authentication middleware for Hono
53
+ */
54
+ export declare function gitAuthMiddleware(config: GitAuthConfig): MiddlewareHandler;
55
+ /**
56
+ * Middleware that requires authentication
57
+ */
58
+ export declare function requireGitAuth(): MiddlewareHandler;
59
+ /**
60
+ * Middleware that requires write access
61
+ */
62
+ export declare function requireGitWrite(): MiddlewareHandler;
63
+ /**
64
+ * Middleware that requires admin access
65
+ */
66
+ export declare function requireGitAdmin(): MiddlewareHandler;
67
+ /**
68
+ * Authenticate a standalone request (for non-Hono use)
69
+ */
70
+ export declare function authenticateRequest(request: Request, config: GitAuthConfig): Promise<{
71
+ success: true;
72
+ context: GitAuthContext;
73
+ } | {
74
+ success: false;
75
+ error: string;
76
+ }>;
77
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/mcp/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAiB,MAAM,MAAM,CAAA;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAG5D,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAE5D;;GAEG;AACH,OAAO,QAAQ,MAAM,CAAC;IACpB,UAAU,kBAAkB;QAC1B,OAAO,EAAE,cAAc,CAAA;KACxB;CACF;AAyJD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,iBAAiB,CAkD1E;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,iBAAiB,CAalD;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,iBAAiB,CAanD;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,iBAAiB,CAoBnD;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,cAAc,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAiCzF"}
@@ -0,0 +1,278 @@
1
+ /**
2
+ * Git MCP Authentication Middleware
3
+ *
4
+ * Provides OAuth 2.1 authentication via oauth.do for MCP git operations.
5
+ * Implements token introspection (RFC 7662) for access control.
6
+ *
7
+ * ## Authentication Flow
8
+ *
9
+ * 1. MCP client sends request with Bearer token
10
+ * 2. Middleware introspects token via oauth.do
11
+ * 3. Scopes determine access level:
12
+ * - `read` or `git:read` - read-only access
13
+ * - `write` or `git:write` - full access
14
+ * - `admin` or `git:admin` - admin access
15
+ *
16
+ * ## Usage with Hono
17
+ *
18
+ * ```typescript
19
+ * import { Hono } from 'hono'
20
+ * import { gitAuthMiddleware, requireGitWrite } from 'gitx.do/mcp'
21
+ *
22
+ * const app = new Hono()
23
+ *
24
+ * // Apply auth middleware to all routes
25
+ * app.use('/*', gitAuthMiddleware({
26
+ * introspectionUrl: 'https://oauth.do/introspect',
27
+ * clientId: env.OAUTH_CLIENT_ID,
28
+ * clientSecret: env.OAUTH_CLIENT_SECRET,
29
+ * }))
30
+ *
31
+ * // Protect write operations
32
+ * app.post('/git/commit', requireGitWrite(), async (c) => {
33
+ * const auth = c.get('gitAuth')
34
+ * // ...
35
+ * })
36
+ * ```
37
+ *
38
+ * @module mcp/auth
39
+ */
40
+ /**
41
+ * Anonymous context for unauthenticated access
42
+ */
43
+ const ANONYMOUS_CONTEXT = {
44
+ type: 'anon',
45
+ id: 'anonymous',
46
+ readonly: true,
47
+ };
48
+ /**
49
+ * Parse scope string to check for specific scopes
50
+ */
51
+ function parseScopes(scope) {
52
+ if (!scope)
53
+ return new Set();
54
+ return new Set(scope.split(' ').filter(Boolean));
55
+ }
56
+ /**
57
+ * Determine if context should be readonly based on scopes
58
+ */
59
+ function isReadonlyScope(scopes) {
60
+ // Has explicit write scope
61
+ if (scopes.has('write') || scopes.has('git:write')) {
62
+ return false;
63
+ }
64
+ // Has admin scope (implies write)
65
+ if (scopes.has('admin') || scopes.has('git:admin')) {
66
+ return false;
67
+ }
68
+ // Check for any scope ending in :write or :admin
69
+ for (const scope of scopes) {
70
+ if (scope.endsWith(':write') || scope.endsWith(':admin')) {
71
+ return false;
72
+ }
73
+ }
74
+ // Default to readonly
75
+ return true;
76
+ }
77
+ /**
78
+ * Check if scopes include admin access
79
+ */
80
+ function hasAdminScope(scopes) {
81
+ if (scopes.has('admin') || scopes.has('git:admin'))
82
+ return true;
83
+ for (const scope of scopes) {
84
+ if (scope.endsWith(':admin')) {
85
+ return true;
86
+ }
87
+ }
88
+ return false;
89
+ }
90
+ /**
91
+ * Perform OAuth 2.0 token introspection
92
+ */
93
+ async function introspectToken(token, config) {
94
+ if (!config.introspectionUrl) {
95
+ return null;
96
+ }
97
+ const body = new URLSearchParams();
98
+ body.set('token', token);
99
+ const headers = {
100
+ 'Content-Type': 'application/x-www-form-urlencoded',
101
+ Accept: 'application/json',
102
+ };
103
+ // Add client authentication if provided
104
+ if (config.clientId && config.clientSecret) {
105
+ const credentials = btoa(`${config.clientId}:${config.clientSecret}`);
106
+ headers['Authorization'] = `Basic ${credentials}`;
107
+ }
108
+ try {
109
+ const response = await fetch(config.introspectionUrl, {
110
+ method: 'POST',
111
+ headers,
112
+ body,
113
+ });
114
+ if (!response.ok) {
115
+ return null;
116
+ }
117
+ return await response.json();
118
+ }
119
+ catch {
120
+ return null;
121
+ }
122
+ }
123
+ /**
124
+ * Create GitAuthContext from introspection response
125
+ */
126
+ function createAuthContext(response) {
127
+ const scopes = parseScopes(response.scope);
128
+ const readonly = isReadonlyScope(scopes);
129
+ const isAdmin = hasAdminScope(scopes);
130
+ const id = response.sub ?? response.client_id ?? 'unknown';
131
+ const metadata = {};
132
+ if (response.scope)
133
+ metadata.scope = response.scope;
134
+ if (response.exp)
135
+ metadata.exp = response.exp;
136
+ if (response.iat)
137
+ metadata.iat = response.iat;
138
+ if (response.client_id)
139
+ metadata.client_id = response.client_id;
140
+ if (response.iss)
141
+ metadata.iss = response.iss;
142
+ return {
143
+ type: 'oauth',
144
+ id,
145
+ readonly,
146
+ isAdmin: isAdmin || undefined,
147
+ scopes,
148
+ metadata: Object.keys(metadata).length > 0 ? metadata : undefined,
149
+ };
150
+ }
151
+ /**
152
+ * Extract Bearer token from Authorization header
153
+ */
154
+ function extractBearerToken(request) {
155
+ const authHeader = request.headers.get('Authorization');
156
+ if (!authHeader)
157
+ return null;
158
+ const parts = authHeader.split(' ');
159
+ if (parts.length !== 2 || parts[0].toLowerCase() !== 'bearer') {
160
+ return null;
161
+ }
162
+ return parts[1];
163
+ }
164
+ /**
165
+ * Create authentication middleware for Hono
166
+ */
167
+ export function gitAuthMiddleware(config) {
168
+ return async (c, next) => {
169
+ const token = extractBearerToken(c.req.raw);
170
+ // No token provided
171
+ if (!token) {
172
+ if (config.allowAnonymous) {
173
+ const anonContext = {
174
+ ...ANONYMOUS_CONTEXT,
175
+ readonly: config.anonymousReadonly !== false,
176
+ };
177
+ c.set('gitAuth', anonContext);
178
+ await next();
179
+ return;
180
+ }
181
+ return c.json({ error: { code: 'UNAUTHORIZED', message: 'Authentication required' } }, { status: 401, headers: { 'WWW-Authenticate': 'Bearer' } });
182
+ }
183
+ // Try API key verification if configured
184
+ if (config.verifyApiKey) {
185
+ const apiKeyContext = await config.verifyApiKey(token);
186
+ if (apiKeyContext) {
187
+ c.set('gitAuth', apiKeyContext);
188
+ await next();
189
+ return;
190
+ }
191
+ }
192
+ // Try OAuth token introspection
193
+ if (config.introspectionUrl) {
194
+ const introspection = await introspectToken(token, config);
195
+ if (introspection?.active) {
196
+ const authContext = createAuthContext(introspection);
197
+ c.set('gitAuth', authContext);
198
+ await next();
199
+ return;
200
+ }
201
+ }
202
+ // Token invalid or expired
203
+ return c.json({ error: { code: 'INVALID_TOKEN', message: 'Token is invalid or expired' } }, { status: 401, headers: { 'WWW-Authenticate': 'Bearer error="invalid_token"' } });
204
+ };
205
+ }
206
+ /**
207
+ * Middleware that requires authentication
208
+ */
209
+ export function requireGitAuth() {
210
+ return async (c, next) => {
211
+ const auth = c.get('gitAuth');
212
+ if (!auth || auth.type === 'anon') {
213
+ return c.json({ error: { code: 'UNAUTHORIZED', message: 'Authentication required' } }, { status: 401, headers: { 'WWW-Authenticate': 'Bearer' } });
214
+ }
215
+ await next();
216
+ };
217
+ }
218
+ /**
219
+ * Middleware that requires write access
220
+ */
221
+ export function requireGitWrite() {
222
+ return async (c, next) => {
223
+ const auth = c.get('gitAuth');
224
+ if (!auth || auth.readonly) {
225
+ return c.json({ error: { code: 'FORBIDDEN', message: 'Write access required' } }, { status: 403 });
226
+ }
227
+ await next();
228
+ };
229
+ }
230
+ /**
231
+ * Middleware that requires admin access
232
+ */
233
+ export function requireGitAdmin() {
234
+ return async (c, next) => {
235
+ const auth = c.get('gitAuth');
236
+ if (!auth || auth.type === 'anon') {
237
+ return c.json({ error: { code: 'UNAUTHORIZED', message: 'Authentication required' } }, { status: 401, headers: { 'WWW-Authenticate': 'Bearer' } });
238
+ }
239
+ if (!auth.isAdmin) {
240
+ return c.json({ error: { code: 'FORBIDDEN', message: 'Admin access required' } }, { status: 403 });
241
+ }
242
+ await next();
243
+ };
244
+ }
245
+ /**
246
+ * Authenticate a standalone request (for non-Hono use)
247
+ */
248
+ export async function authenticateRequest(request, config) {
249
+ const token = extractBearerToken(request);
250
+ if (!token) {
251
+ if (config.allowAnonymous) {
252
+ return {
253
+ success: true,
254
+ context: {
255
+ ...ANONYMOUS_CONTEXT,
256
+ readonly: config.anonymousReadonly !== false,
257
+ },
258
+ };
259
+ }
260
+ return { success: false, error: 'Authentication required' };
261
+ }
262
+ // Try API key
263
+ if (config.verifyApiKey) {
264
+ const context = await config.verifyApiKey(token);
265
+ if (context) {
266
+ return { success: true, context };
267
+ }
268
+ }
269
+ // Try OAuth
270
+ if (config.introspectionUrl) {
271
+ const introspection = await introspectToken(token, config);
272
+ if (introspection?.active) {
273
+ return { success: true, context: createAuthContext(introspection) };
274
+ }
275
+ }
276
+ return { success: false, error: 'Invalid or expired token' };
277
+ }
278
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/mcp/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * gitx.do MCP Server
3
+ *
4
+ * Model Context Protocol server for git operations.
5
+ * Exposes git tools with OAuth 2.1 authentication via oauth.do.
6
+ *
7
+ * @module mcp
8
+ */
9
+ export { type McpToolResult, type McpToolSchema, type McpToolHandler, type McpTool, type ToolRegistry, type ToolContext, type ToolMiddleware, type InvokeToolOptions, registerTool, unregisterTool, invokeTool, getToolRegistry, clearToolRegistry, useMiddleware, clearMiddleware, } from './tool-registry';
10
+ export { gitTools, gitStatusToolSchema, gitLogToolSchema, gitDiffToolSchema, gitShowToolSchema, gitCommitToolSchema, gitBranchToolSchema, gitCheckoutToolSchema, gitAddToolSchema, gitResetToolSchema, gitMergeToolSchema, gitRebaseToolSchema, gitStashToolSchema, gitTagToolSchema, gitRemoteToolSchema, gitFetchToolSchema, gitPushToolSchema, gitPullToolSchema, gitCloneToolSchema, gitInitToolSchema, gitBlameToolSchema, } from './tools';
11
+ export { gitAuthMiddleware, requireGitAuth, requireGitWrite, requireGitAdmin, type GitAuthContext, type GitAuthConfig, } from './auth';
12
+ export { createGitMCPServer, type GitMCPServerOptions } from './server';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,OAAO,EACZ,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,YAAY,EACZ,cAAc,EACd,UAAU,EACV,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,eAAe,GAChB,MAAM,iBAAiB,CAAA;AAGxB,OAAO,EACL,QAAQ,EAER,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,SAAS,CAAA;AAGhB,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,eAAe,EACf,KAAK,cAAc,EACnB,KAAK,aAAa,GACnB,MAAM,QAAQ,CAAA;AAGf,OAAO,EAAE,kBAAkB,EAAE,KAAK,mBAAmB,EAAE,MAAM,UAAU,CAAA"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * gitx.do MCP Server
3
+ *
4
+ * Model Context Protocol server for git operations.
5
+ * Exposes git tools with OAuth 2.1 authentication via oauth.do.
6
+ *
7
+ * @module mcp
8
+ */
9
+ // Core MCP types and server
10
+ export { registerTool, unregisterTool, invokeTool, getToolRegistry, clearToolRegistry, useMiddleware, clearMiddleware, } from './tool-registry';
11
+ // Git tools
12
+ export { gitTools,
13
+ // Individual tool schemas
14
+ gitStatusToolSchema, gitLogToolSchema, gitDiffToolSchema, gitShowToolSchema, gitCommitToolSchema, gitBranchToolSchema, gitCheckoutToolSchema, gitAddToolSchema, gitResetToolSchema, gitMergeToolSchema, gitRebaseToolSchema, gitStashToolSchema, gitTagToolSchema, gitRemoteToolSchema, gitFetchToolSchema, gitPushToolSchema, gitPullToolSchema, gitCloneToolSchema, gitInitToolSchema, gitBlameToolSchema, } from './tools';
15
+ // Auth middleware
16
+ export { gitAuthMiddleware, requireGitAuth, requireGitWrite, requireGitAdmin, } from './auth';
17
+ // Server factory
18
+ export { createGitMCPServer } from './server';
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,4BAA4B;AAC5B,OAAO,EASL,YAAY,EACZ,cAAc,EACd,UAAU,EACV,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,eAAe,GAChB,MAAM,iBAAiB,CAAA;AAExB,YAAY;AACZ,OAAO,EACL,QAAQ;AACR,0BAA0B;AAC1B,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,SAAS,CAAA;AAEhB,kBAAkB;AAClB,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,eAAe,GAGhB,MAAM,QAAQ,CAAA;AAEf,iBAAiB;AACjB,OAAO,EAAE,kBAAkB,EAA4B,MAAM,UAAU,CAAA"}
@@ -0,0 +1,200 @@
1
+ /**
2
+ * Git MCP Server Factory
3
+ *
4
+ * Creates MCP server instances for git operations.
5
+ * Provides a high-level API compatible with the MCP specification.
6
+ *
7
+ * ## Architecture
8
+ *
9
+ * The MCP server exposes git operations through three primitives:
10
+ *
11
+ * 1. **search** - Search git history, branches, tags
12
+ * 2. **fetch** - Fetch specific commits, files, or refs
13
+ * 3. **do** - Execute git operations via sandboxed TypeScript
14
+ *
15
+ * Plus individual git tools (git_status, git_commit, etc.) for direct access.
16
+ *
17
+ * ## Usage
18
+ *
19
+ * ```typescript
20
+ * import { createGitMCPServer } from 'gitx.do/mcp'
21
+ *
22
+ * const server = createGitMCPServer({
23
+ * name: 'my-git-server',
24
+ * auth: {
25
+ * introspectionUrl: 'https://oauth.do/introspect',
26
+ * clientId: env.OAUTH_CLIENT_ID,
27
+ * clientSecret: env.OAUTH_CLIENT_SECRET,
28
+ * },
29
+ * repository: gitRepo, // GitRepoDO instance or context
30
+ * })
31
+ *
32
+ * // Start server with transport
33
+ * await server.connect(transport)
34
+ * ```
35
+ *
36
+ * @module mcp/server
37
+ */
38
+ import { Hono } from 'hono';
39
+ import { type GitAuthConfig, type GitAuthContext } from './auth';
40
+ import { type McpToolResult } from './tool-registry';
41
+ /**
42
+ * Options for creating a Git MCP server
43
+ */
44
+ export interface GitMCPServerOptions {
45
+ /** Server name (default: 'gitx.do') */
46
+ name?: string;
47
+ /** Server version (default: '1.0.0') */
48
+ version?: string;
49
+ /** Authentication configuration */
50
+ auth?: GitAuthConfig;
51
+ /** Repository context for operations */
52
+ repository?: GitRepositoryContext;
53
+ }
54
+ /**
55
+ * Repository context interface
56
+ */
57
+ export interface GitRepositoryContext {
58
+ /** Get status of the repository */
59
+ status(options?: StatusOptions): Promise<StatusResult>;
60
+ /** Get commit log */
61
+ log(options?: LogOptions): Promise<LogResult>;
62
+ /** Get diff between commits */
63
+ diff(options?: DiffOptions): Promise<DiffResult>;
64
+ /** Show a git object */
65
+ show(revision: string, options?: ShowOptions): Promise<ShowResult>;
66
+ /** Create a commit */
67
+ commit(message: string, options?: CommitOptions): Promise<CommitResult>;
68
+ /** List/create/delete branches */
69
+ branch(options?: BranchOptions): Promise<BranchResult>;
70
+ /** Checkout a ref */
71
+ checkout(ref: string, options?: CheckoutOptions): Promise<void>;
72
+ /** Add files to index */
73
+ add(options?: AddOptions): Promise<void>;
74
+ /** Reset to a state */
75
+ reset(options?: ResetOptions): Promise<void>;
76
+ /** Merge branches */
77
+ merge(branch: string, options?: MergeOptions): Promise<MergeResult>;
78
+ /** Get blame information */
79
+ blame(path: string, options?: BlameOptions): Promise<BlameResult>;
80
+ }
81
+ interface StatusOptions {
82
+ short?: boolean;
83
+ branch?: boolean;
84
+ }
85
+ interface StatusResult {
86
+ staged: string[];
87
+ modified: string[];
88
+ untracked: string[];
89
+ branch?: string;
90
+ }
91
+ interface LogOptions {
92
+ maxCount?: number;
93
+ oneline?: boolean;
94
+ ref?: string;
95
+ author?: string;
96
+ }
97
+ interface LogResult {
98
+ commits: Array<{
99
+ hash: string;
100
+ author: string;
101
+ date: Date;
102
+ message: string;
103
+ }>;
104
+ }
105
+ interface DiffOptions {
106
+ staged?: boolean;
107
+ commit1?: string;
108
+ commit2?: string;
109
+ path?: string;
110
+ }
111
+ interface DiffResult {
112
+ files: Array<{
113
+ path: string;
114
+ status: string;
115
+ additions: number;
116
+ deletions: number;
117
+ }>;
118
+ }
119
+ interface ShowOptions {
120
+ format?: string;
121
+ path?: string;
122
+ }
123
+ interface ShowResult {
124
+ content: string;
125
+ metadata?: Record<string, unknown>;
126
+ }
127
+ interface CommitOptions {
128
+ author?: string;
129
+ email?: string;
130
+ amend?: boolean;
131
+ }
132
+ interface CommitResult {
133
+ hash: string;
134
+ message: string;
135
+ }
136
+ interface BranchOptions {
137
+ name?: string;
138
+ delete?: boolean;
139
+ list?: boolean;
140
+ all?: boolean;
141
+ }
142
+ interface BranchResult {
143
+ branches?: string[];
144
+ current?: string;
145
+ created?: boolean;
146
+ deleted?: boolean;
147
+ }
148
+ interface CheckoutOptions {
149
+ createBranch?: boolean;
150
+ }
151
+ interface AddOptions {
152
+ files?: string[];
153
+ all?: boolean;
154
+ }
155
+ interface ResetOptions {
156
+ mode?: 'soft' | 'mixed' | 'hard';
157
+ commit?: string;
158
+ }
159
+ interface MergeOptions {
160
+ noFf?: boolean;
161
+ squash?: boolean;
162
+ }
163
+ interface MergeResult {
164
+ success: boolean;
165
+ conflicts?: string[];
166
+ }
167
+ interface BlameOptions {
168
+ startLine?: number;
169
+ endLine?: number;
170
+ }
171
+ interface BlameResult {
172
+ lines: Array<{
173
+ line: number;
174
+ commit: string;
175
+ author: string;
176
+ content: string;
177
+ }>;
178
+ }
179
+ /**
180
+ * MCP Server wrapper
181
+ */
182
+ export interface GitMCPServer {
183
+ /** The Hono app instance */
184
+ app: Hono;
185
+ /** Server info */
186
+ info: {
187
+ name: string;
188
+ version: string;
189
+ };
190
+ /** Get registered tool names */
191
+ getTools(): string[];
192
+ /** Invoke a tool directly */
193
+ invokeTool(name: string, params: Record<string, unknown>, auth?: GitAuthContext): Promise<McpToolResult>;
194
+ }
195
+ /**
196
+ * Create a Git MCP server
197
+ */
198
+ export declare function createGitMCPServer(options?: GitMCPServerOptions): GitMCPServer;
199
+ export {};
200
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}