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 +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/auth.d.ts +77 -0
- package/dist/mcp/auth.d.ts.map +1 -0
- package/dist/mcp/auth.js +278 -0
- package/dist/mcp/auth.js.map +1 -0
- package/dist/mcp/index.d.ts +13 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +19 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +200 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +275 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tool-registry.d.ts +47 -0
- package/dist/mcp/tool-registry.d.ts.map +1 -0
- package/dist/mcp/tool-registry.js +284 -0
- package/dist/mcp/tool-registry.js.map +1 -0
- package/dist/mcp/tools.d.ts +136 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +759 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/mcp/types.d.ts +124 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +9 -0
- package/dist/mcp/types.js.map +1 -0
- package/package.json +9 -3
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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"}
|
package/dist/mcp/auth.js
ADDED
|
@@ -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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"}
|