mirror of
https://github.com/modelcontextprotocol/servers.git
synced 2026-04-28 00:35:16 +02:00
Merge branch 'main' into patch-1
This commit is contained in:
@@ -99,12 +99,14 @@ A growing set of community-developed and maintained servers demonstrates various
|
|||||||
- **[Docker](https://github.com/ckreiling/mcp-server-docker)** - Integrate with Docker to manage containers, images, volumes, and networks.
|
- **[Docker](https://github.com/ckreiling/mcp-server-docker)** - Integrate with Docker to manage containers, images, volumes, and networks.
|
||||||
- **[Drupal](https://github.com/Omedia/mcp-server-drupal)** - Server for interacting with [Drupal](https://www.drupal.org/project/mcp) using STDIO transport layer.
|
- **[Drupal](https://github.com/Omedia/mcp-server-drupal)** - Server for interacting with [Drupal](https://www.drupal.org/project/mcp) using STDIO transport layer.
|
||||||
- **[Elasticsearch](https://github.com/cr7258/elasticsearch-mcp-server)** - MCP server implementation that provides Elasticsearch interaction.
|
- **[Elasticsearch](https://github.com/cr7258/elasticsearch-mcp-server)** - MCP server implementation that provides Elasticsearch interaction.
|
||||||
|
- **[ElevenLabs](https://github.com/mamertofabian/elevenlabs-mcp-server)** - A server that integrates with ElevenLabs text-to-speech API capable of generating full voiceovers with multiple voices.
|
||||||
- **[Everything Search](https://github.com/mamertofabian/mcp-everything-search)** - Fast file searching capabilities across Windows (using [Everything SDK](https://www.voidtools.com/support/everything/sdk/)), macOS (using mdfind command), and Linux (using locate/plocate command).
|
- **[Everything Search](https://github.com/mamertofabian/mcp-everything-search)** - Fast file searching capabilities across Windows (using [Everything SDK](https://www.voidtools.com/support/everything/sdk/)), macOS (using mdfind command), and Linux (using locate/plocate command).
|
||||||
- **[Fetch](https://github.com/zcaceres/fetch-mcp)** - A server that flexibly fetches HTML, JSON, Markdown, or plaintext.
|
- **[Fetch](https://github.com/zcaceres/fetch-mcp)** - A server that flexibly fetches HTML, JSON, Markdown, or plaintext.
|
||||||
- **[FireCrawl](https://github.com/vrknetha/mcp-server-firecrawl)** - Advanced web scraping with JavaScript rendering, PDF support, and smart rate limiting
|
- **[FireCrawl](https://github.com/vrknetha/mcp-server-firecrawl)** - Advanced web scraping with JavaScript rendering, PDF support, and smart rate limiting
|
||||||
- **[FlightRadar24](https://github.com/sunsetcoder/flightradar24-mcp-server)** - A Claude Desktop MCP server that helps you track flights in real-time using Flightradar24 data.
|
- **[FlightRadar24](https://github.com/sunsetcoder/flightradar24-mcp-server)** - A Claude Desktop MCP server that helps you track flights in real-time using Flightradar24 data.
|
||||||
- **[Glean](https://github.com/longyi1207/glean-mcp-server)** - A server that uses Glean API to search and chat.
|
- **[Glean](https://github.com/longyi1207/glean-mcp-server)** - A server that uses Glean API to search and chat.
|
||||||
- **[Goal Story](https://github.com/hichana/goalstory-mcp)** - a Goal Tracker and Visualization Tool for personal and professional development.
|
- **[Goal Story](https://github.com/hichana/goalstory-mcp)** - a Goal Tracker and Visualization Tool for personal and professional development.
|
||||||
|
- **[Golang Filesystem Server](https://github.com/mark3labs/mcp-filesystem-server)** - Secure file operations with configurable access controls built with Go!
|
||||||
- **[Google Calendar](https://github.com/v-3/google-calendar)** - Integration with Google Calendar to check schedules, find time, and add/delete events
|
- **[Google Calendar](https://github.com/v-3/google-calendar)** - Integration with Google Calendar to check schedules, find time, and add/delete events
|
||||||
- **[Google Tasks](https://github.com/zcaceres/gtasks-mcp)** - Google Tasks API Model Context Protocol Server.
|
- **[Google Tasks](https://github.com/zcaceres/gtasks-mcp)** - Google Tasks API Model Context Protocol Server.
|
||||||
- **[Home Assistant](https://github.com/tevonsb/homeassistant-mcp)** - Interact with [Home Assistant](https://www.home-assistant.io/) including viewing and controlling lights, switches, sensors, and all other Home Assistant entities.
|
- **[Home Assistant](https://github.com/tevonsb/homeassistant-mcp)** - Interact with [Home Assistant](https://www.home-assistant.io/) including viewing and controlling lights, switches, sensors, and all other Home Assistant entities.
|
||||||
|
|||||||
@@ -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"],
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
1
src/github/common/version.ts
Normal file
1
src/github/common/version.ts
Normal file
@@ -0,0 +1 @@
|
|||||||
|
export const VERSION = "0.6.2";
|
||||||
@@ -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: {
|
||||||
|
|||||||
@@ -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"
|
||||||
},
|
},
|
||||||
@@ -30,4 +31,4 @@
|
|||||||
"shx": "^0.3.4",
|
"shx": "^0.3.4",
|
||||||
"typescript": "^5.6.2"
|
"typescript": "^5.6.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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"]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -223,4 +223,4 @@ docker build -t mcp/memory -f src/memory/Dockerfile .
|
|||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
This MCP server is licensed under the MIT License. This means you are free to use, modify, and distribute the software, subject to the terms and conditions of the MIT License. For more details, please see the LICENSE file in the project repository.
|
This MCP server is licensed under the MIT License. This means you are free to use, modify, and distribute the software, subject to the terms and conditions of the MIT License. For more details, please see the LICENSE file in the project repository.
|
||||||
|
|||||||
Reference in New Issue
Block a user