copilot-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| COPILOT_MCP_WORKSPACE | Yes | The path to the open workspace; relative paths resolve against it and `..` or symlink escapes are rejected. Normally set to ${workspaceFolder}. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| workspace_infoA | Show the workspace root this server is confined to and whether confinement is active. |
| read_fileA | Read a text file. Lines are 1-based and inclusive; end_line=-1 reads to EOF. |
| create_fileC | Create a file (and parent dirs) with the given content. |
| edit_fileA | Replace old_string with new_string in a file. Fails unless it matches exactly once (or replace_all is true). dry_run=true returns a unified diff without writing. |
| edit_file_multiA | Apply several edits atomically. Each edit is {"old_string": ..., "new_string": ..., optional "replace_all": "true"}. Edits apply in order; if any fails nothing is written. |
| replace_linesB | Replace lines start_line..end_line (1-based, inclusive) with new_text. Use end_line=start_line-1 to insert before start_line. |
| list_dirB | List directory entries; directories end with '/'. |
| delete_fileC | Delete a file or directory (recursively). |
| grepA | Regex search file contents. Returns path:line: text matches. Skips git-ignored files (and .git, node_modules, .venv) unless respect_gitignore=false. Use offset to page. |
| globA | Find files by glob pattern (e.g. '**/*.py'), relative to path. Skips git-ignored files unless respect_gitignore=false. Use offset to page. |
| run_commandA | Run a shell command and return exit code, stdout and stderr. The working directory must be inside the workspace (default: the workspace root). The command itself is NOT confined: a shell can still reach any path the server's user can. |
| git_statusC | Show short git status. |
| git_diffB | Show git diff (optionally staged and/or for one path). |
| git_logC | Show recent commits. |
| git_addC | Stage files. |
| git_commitC | Commit staged changes. |
| git_initA | Initialise a new git repository (non-destructive; existing repos are left intact). |
| git_branch_createB | Create a new branch (and optionally switch to it). Never overwrites an existing branch. |
| git_switchB | Switch to an existing branch. Git refuses if it would overwrite local changes. |
| git_tag_createB | Create a tag (annotated if message given). Never moves or replaces an existing tag. |
| git_pushB | Push a branch (default: current) to a remote. Force pushes and ref deletion are not supported. tags=true pushes tags instead of a branch. |
| git_blameA | Show who last changed each line of a file (read-only). Optionally limit to a line range. |
| git_showB | Show a commit's message and diff (read-only). stat_only=true gives only the file summary. |
| git_branch_listA | List branches with their last commit and upstream (read-only). all_branches includes remotes. |
| git_stash_listC | List stashes (read-only). |
| git_remote_infoA | List configured remotes and their URLs (read-only). Credentials in URLs are masked. |
| git_diff_statC | Summarise changes per file (read-only), compact for large diffs. base compares with a revision. |
| run_testsC | Run pytest on a path with optional extra args (e.g. '-k name -x'). |
| lintC | Lint Python code with ruff (optionally auto-fix). |
| format_codeB | Format Python code with ruff; check_only=True only reports. |
| web_fetchA | Download a web page (after explicit user confirmation), sanitise it and save it as a local markdown file. Returns the file path only; read the file to consume it. Executable/archive/ document extensions and non-text content types are rejected; scripts, forms, iframes, event handlers and unsafe links are stripped. Private/loopback addresses are blocked. |
| convert_dataA | Convert between json, yaml, toml, csv, xml and psd1 (PowerShell data files). Provide either path or text. from_format is inferred from the file extension when omitted. With output_path the result is written there; otherwise it is returned. Reading psd1 needs pwsh (restricted language mode, no code execution); XML uses @attr / #text conventions. |
| query_dataA | Extract values from a json/yaml/toml/csv/xml/psd1 file with a path expression such as 'servers[0].name', 'users[].email' or '.port'. Returns JSON (a list of matches). |
| script_to_markdownB | Convert a script into literate markdown: column-0 comment blocks (and PowerShell <# #> blocks) become prose, everything else becomes fenced code. Heuristic and meant for documentation; markdown_to_script reverses it. |
| markdown_to_scriptB | Extract code from a markdown file. Only fenced blocks tagged with |
| pandoc_convertB | Convert documents with pandoc (docx, html, md, rst, pdf output needs a LaTeX engine...). Runs in --sandbox mode so the document cannot read other files or run filters. |
| http_requestA | Send an HTTP request (localhost and private addresses allowed) and report status, timing, redacted headers and a truncated body. Optional assertions: expect_status, expect_json ({"data.items[0].id": 5} path->value), expect_contains (substring of body), max_latency_ms. Result begins with PASS/FAIL when assertions are given. |
| api_load_testA | Tiny load probe: send |
| system_infoB | OS, kernel, uptime, CPU, load, memory, swap and disk usage for this machine. |
| list_processesB | List processes (pid, name, user, cpu%, memory) sorted by 'memory' or 'cpu' or 'pid'. |
| list_portsB | List TCP/UDP sockets with owning process. May need elevated rights to see other users' PIDs. |
| network_interfacesA | NIC configuration: addresses, netmask, MAC, MTU, speed and up/down state, plus I/O counters. |
| dns_lookupB | Resolve a hostname to its addresses using the system resolver. |
| check_tcp_portB | Test whether a TCP connection to host:port succeeds, with connect time. |
| list_servicesA | List services (systemd on Linux, Get-Service on Windows, launchctl on macOS). state: e.g. running / stopped (Windows) or running / failed / active (systemd). |
| service_statusC | Detailed status of one service. |
| read_event_logsB | Recent system events. Linux: journalctl (source = unit name, level = minimum severity).
Windows: Get-WinEvent (source = log name, default 'System'; level = exact level).
macOS: |
| cim_queryA | Query CIM/WMI classes via Get-CimInstance (Windows only), e.g. Win32_OperatingSystem,
Win32_LogicalDisk, Win32_NetworkAdapterConfiguration, Win32_Service. |
| environment_variablesB | Environment variables of the server process. Values of secret-looking names are redacted. |
| todo_listA | List the workspace todo scratchpad. Optional status filter: pending, in_progress, done. |
| todo_addA | Add a todo (status pending) to the workspace scratchpad and return the updated list. |
| todo_updateA | Change a todo's status (pending, in_progress, done) and/or text; returns the updated list. |
| todo_removeA | Remove one todo from the scratchpad by id; returns the updated list. |
| policy_infoA | Show the active policy file path and contents, and where the audit log is written. |
| audit_tailB | Return the most recent audit log entries (JSON lines), if auditing is enabled. |
| get_tool_docsA | Return usage docs and examples for a tool group (filesystem, search, shell, git, python, web-fetch, data-conversion, api-testing, diagnostics) or 'index'. Call this after a tool error. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| tools_index | Index of tool groups and rules that apply to every tool. |
TDQS
Scored across 56 tools
Most tools target clearly different resources or actions, and the domain grouping helps agents choose correctly. There is some overlap among file-editing tools (edit_file, edit_file_multi, replace_lines) and between run_command and specialized tools like run_tests/lint/format_code, but descriptions make the intended boundaries reasonably clear.
All names use snake_case and several domain prefixes (git_, todo_) provide useful grouping. However, the naming pattern mixes verb_noun (read_file, list_dir), noun_verb/prefix_noun_verb (git_branch_create, todo_add), and bare nouns (grep, glob, lint), so it is readable but not fully predictable.
56 tools is far above the typical well-scoped range and is likely to burden tool selection and context use. The tools are grouped sensibly by domain, but the overall surface is too large for a single MCP server.
The server covers a very broad coding-assistant surface: filesystem operations, git workflows, Python lint/test/format, web/API testing, diagnostics, data conversion, todos, and policy/audit helpers. Some lifecycle operations are missing or indirect, such as git pull/fetch/merge/clone and file move/copy, but run_command provides a fallback for many gaps.