Merge branch 'main' into add-elevenlabs

This commit is contained in:
Jerome
2025-02-07 13:07:56 +13:00
committed by GitHub
8 changed files with 49 additions and 9 deletions

View File

@@ -12,6 +12,7 @@ import {
import fs from "fs"; import fs from "fs";
import { google } from "googleapis"; import { google } from "googleapis";
import path from "path"; import path from "path";
import { fileURLToPath } from 'url';
const drive = google.drive("v3"); const drive = google.drive("v3");
@@ -176,7 +177,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
}); });
const credentialsPath = process.env.GDRIVE_CREDENTIALS_PATH || path.join( const credentialsPath = process.env.GDRIVE_CREDENTIALS_PATH || path.join(
path.dirname(new URL(import.meta.url).pathname), path.dirname(fileURLToPath(import.meta.url)),
"../../../.gdrive-server-credentials.json", "../../../.gdrive-server-credentials.json",
); );
@@ -184,7 +185,7 @@ async function authenticateAndSaveCredentials() {
console.log("Launching auth flow…"); console.log("Launching auth flow…");
const auth = await authenticate({ const auth = await authenticate({
keyfilePath: process.env.GDRIVE_OAUTH_PATH || path.join( keyfilePath: process.env.GDRIVE_OAUTH_PATH || path.join(
path.dirname(new URL(import.meta.url).pathname), path.dirname(fileURLToPath(import.meta.url)),
"../../../gcp-oauth.keys.json", "../../../gcp-oauth.keys.json",
), ),
scopes: ["https://www.googleapis.com/auth/drive.readonly"], scopes: ["https://www.googleapis.com/auth/drive.readonly"],

View File

@@ -67,18 +67,23 @@ Please note that mcp-server-git is currently in early development. The functiona
- `branch_name` (string): Name of the new branch - `branch_name` (string): Name of the new branch
- `start_point` (string, optional): Starting point for the new branch - `start_point` (string, optional): Starting point for the new branch
- Returns: Confirmation of branch creation - Returns: Confirmation of branch creation
8. `git_checkout` 10. `git_checkout`
- Switches branches - Switches branches
- Inputs: - Inputs:
- `repo_path` (string): Path to Git repository - `repo_path` (string): Path to Git repository
- `branch_name` (string): Name of branch to checkout - `branch_name` (string): Name of branch to checkout
- Returns: Confirmation of branch switch - Returns: Confirmation of branch switch
9. `git_show` 11. `git_show`
- Shows the contents of a commit - Shows the contents of a commit
- Inputs: - Inputs:
- `repo_path` (string): Path to Git repository - `repo_path` (string): Path to Git repository
- `revision` (string): The revision (commit hash, branch name, tag) to show - `revision` (string): The revision (commit hash, branch name, tag) to show
- Returns: Contents of the specified commit - Returns: Contents of the specified commit
12. `git_init`
- Initializes a Git repository
- Inputs:
- `repo_path` (string): Path to directory to initialize git repo
- Returns: Confirmation of repository initialization
## Installation ## Installation

View File

@@ -56,6 +56,9 @@ class GitShow(BaseModel):
repo_path: str repo_path: str
revision: str revision: str
class GitInit(BaseModel):
repo_path: str
class GitTools(str, Enum): class GitTools(str, Enum):
STATUS = "git_status" STATUS = "git_status"
DIFF_UNSTAGED = "git_diff_unstaged" DIFF_UNSTAGED = "git_diff_unstaged"
@@ -68,6 +71,7 @@ class GitTools(str, Enum):
CREATE_BRANCH = "git_create_branch" CREATE_BRANCH = "git_create_branch"
CHECKOUT = "git_checkout" CHECKOUT = "git_checkout"
SHOW = "git_show" SHOW = "git_show"
INIT = "git_init"
def git_status(repo: git.Repo) -> str: def git_status(repo: git.Repo) -> str:
return repo.git.status() return repo.git.status()
@@ -118,6 +122,13 @@ def git_checkout(repo: git.Repo, branch_name: str) -> str:
repo.git.checkout(branch_name) repo.git.checkout(branch_name)
return f"Switched to branch '{branch_name}'" return f"Switched to branch '{branch_name}'"
def git_init(repo_path: str) -> str:
try:
repo = git.Repo.init(path=repo_path, mkdir=True)
return f"Initialized empty Git repository in {repo.git_dir}"
except Exception as e:
return f"Error initializing repository: {str(e)}"
def git_show(repo: git.Repo, revision: str) -> str: def git_show(repo: git.Repo, revision: str) -> str:
commit = repo.commit(revision) commit = repo.commit(revision)
output = [ output = [
@@ -206,6 +217,11 @@ async def serve(repository: Path | None) -> None:
name=GitTools.SHOW, name=GitTools.SHOW,
description="Shows the contents of a commit", description="Shows the contents of a commit",
inputSchema=GitShow.schema(), inputSchema=GitShow.schema(),
),
Tool(
name=GitTools.INIT,
description="Initialize a new Git repository",
inputSchema=GitInit.schema(),
) )
] ]
@@ -241,6 +257,16 @@ async def serve(repository: Path | None) -> None:
@server.call_tool() @server.call_tool()
async def call_tool(name: str, arguments: dict) -> list[TextContent]: async def call_tool(name: str, arguments: dict) -> list[TextContent]:
repo_path = Path(arguments["repo_path"]) repo_path = Path(arguments["repo_path"])
# Handle git init separately since it doesn't require an existing repo
if name == GitTools.INIT:
result = git_init(str(repo_path))
return [TextContent(
type="text",
text=result
)]
# For all other commands, we need an existing repo
repo = git.Repo(repo_path) repo = git.Repo(repo_path)
match name: match name:

View File

@@ -1,10 +1,12 @@
import { getUserAgent } from "universal-user-agent";
import { createGitHubError } from "./errors.js"; import { createGitHubError } from "./errors.js";
import { VERSION } from "./version.js";
type RequestOptions = { type RequestOptions = {
method?: string; method?: string;
body?: unknown; body?: unknown;
headers?: Record<string, string>; headers?: Record<string, string>;
}; }
async function parseResponseBody(response: Response): Promise<unknown> { async function parseResponseBody(response: Response): Promise<unknown> {
const contentType = response.headers.get("content-type"); const contentType = response.headers.get("content-type");
@@ -24,6 +26,8 @@ export function buildUrl(baseUrl: string, params: Record<string, string | number
return url.toString(); return url.toString();
} }
const USER_AGENT = `modelcontextprotocol/servers/github/v${VERSION} ${getUserAgent()}`;
export async function githubRequest( export async function githubRequest(
url: string, url: string,
options: RequestOptions = {} options: RequestOptions = {}
@@ -31,6 +35,7 @@ export async function githubRequest(
const headers: Record<string, string> = { const headers: Record<string, string> = {
"Accept": "application/vnd.github.v3+json", "Accept": "application/vnd.github.v3+json",
"Content-Type": "application/json", "Content-Type": "application/json",
"User-Agent": USER_AGENT,
...options.headers, ...options.headers,
}; };

View File

@@ -0,0 +1 @@
export const VERSION = "0.6.2";

View File

@@ -25,11 +25,12 @@ import {
GitHubConflictError, GitHubConflictError,
isGitHubError, isGitHubError,
} from './common/errors.js'; } from './common/errors.js';
import { VERSION } from "./common/version.js";
const server = new Server( const server = new Server(
{ {
name: "github-mcp-server", name: "github-mcp-server",
version: "0.1.0", version: VERSION,
}, },
{ {
capabilities: { capabilities: {

View File

@@ -23,6 +23,7 @@
"@types/node": "^22", "@types/node": "^22",
"@types/node-fetch": "^2.6.12", "@types/node-fetch": "^2.6.12",
"node-fetch": "^3.3.2", "node-fetch": "^3.3.2",
"universal-user-agent": "^7.0.2",
"zod": "^3.22.4", "zod": "^3.22.4",
"zod-to-json-schema": "^3.23.5" "zod-to-json-schema": "^3.23.5"
}, },

View File

@@ -137,7 +137,7 @@ Add this to your claude_desktop_config.json:
"mcpServers": { "mcpServers": {
"memory": { "memory": {
"command": "docker", "command": "docker",
"args": ["run", "-i", "--rm", "mcp/memory"] "args": ["run", "-i", "-v", "claude-memory:/app/dist", "--rm", "mcp/memory"]
} }
} }
} }