CLI for Microsoft 365 MCP Server
Microsoft 365 MCP 서버용 CLI
💡 설명
현재 이 작업은 진행 중이며 해결책이라기보다는 POC에 가깝습니다.
Related MCP server: Microsoft MCP
📦 필수 조건
Node.js 20.x 이상
🚀 빌드 및 실행 방법
무엇보다도 먼저 npm install 실행하여 모든 종속성을 설치하세요.
그런 다음 프로젝트를 빌드하려면 다음을 실행합니다.
지엑스피1
이 MCP 서버는 npm i -g @pnp/cli-microsoft365 사용하여 전역적으로 설치해야 하는 Microsoft 365용 글로벌 설치 CLI를 사용합니다.
MCP 서버는 사용자를 대신하여 인증을 수행하지 않습니다. 먼저 Microsoft 365 CLI에서 m365 login 명령을 사용하여 인증해야 합니다. 인증이 완료되면 MCP 서버는 모든 도구를 실행할 때 동일한 인증 컨텍스트를 사용합니다.
검사기를 사용하여 MCP 실행
Microsoft 365 MCP 서버의 CLI를 테스트하는 방법 중 하나는 MCP Inspector를 사용하는 것입니다. 먼저 다음 명령을 사용하여 MCP 서버를 시작하세요.
npm run start이제 MCP 서버의 검사기를 실행하려면 repo 루트 폴더 위치에서 다음 명령을 실행해야 합니다.
npx @modelcontextprotocol/inspector node dist/index.js그 후 검사기가 시작될 때까지 기다렸다가 브라우저에서 검사기를 열어 보세요. MCP 서버가 실행 중인 것을 확인할 수 있으며, 도구를 쿼리하고 로컬에서 실행할 수 있습니다.

VS Code에서 MCP 실행
로컬 빌드에서 VS Code로 MCP 서버를 실행하여 GitHub Copilot Agent에서 사용할 수도 있습니다. 먼저 다음 명령을 사용하여 Microsoft 365 MCP 서버 CLI를 시작하세요.
npm run start이제 VS Code GitHub Copilot Agent 모드로 이동하여 도구 아이콘을 클릭하고 Add more tools 선택하세요. 그런 다음 Add MCP server 선택하고 Command (stdio) 선택한 후 다음 명령을 입력하세요.
node FULL_PATH_TO_YOUR_PROJECT/dist/index.jsEnter 키를 누르고 원하는 이름을 입력하세요. 테스트를 위해 workspace 범위에 추가하는 것이 좋습니다. 그런 다음 .vscode/mcp.json 파일을 열고 인증에 필요한 환경 변수를 전달하도록 수정하세요.
{
"servers": {
"m365-mcp-server": {
"type": "stdio",
"command": "node",
"args": [
"FULL_PATH_TO_YOUR_PROJECT/dist/index.js" // e.g. C:/workspace/repo/microsoft-365-mcp-server/dist/index.js
]
}
}
}시작을 클릭하면 GitHub Copilot Agent에 358개의 새로운 도구가 추가된 것을 확인할 수 있습니다. 직접 테스트해 보세요. 최상의 결과를 얻으려면 AI 모델로 Claude 3.5 Sonnet 사용하는 것이 좋습니다.

🔗 리소스
Available Tools
4 toolslist-addC
Creates list in the specified site
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Title of the list to add. | |
| webUrl | Yes | URL of the site where the list should be added. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states 'Creates' which implies a write/mutation operation, but doesn't disclose any behavioral traits like permissions needed, whether the operation is idempotent, what happens on failure, or rate limits. This leaves significant gaps for an agent to understand how to use it safely.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise at just 5 words, with no wasted words. It's front-loaded with the core action and resource. Every word earns its place in conveying the essential purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given this is a creation/mutation tool with no annotations and no output schema, the description is insufficiently complete. It doesn't explain what the tool returns, error conditions, or behavioral constraints. For a tool that modifies state, more context is needed for safe and effective use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds minimal semantic context beyond the schema. It mentions 'in the specified site' which relates to the webUrl parameter, but doesn't explain what constitutes a valid site URL or provide examples. With 100% schema description coverage, the baseline is 3, and the description doesn't significantly enhance parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Creates') and resource ('list in the specified site'), making the purpose understandable. However, it doesn't distinguish this tool from its siblings (list-get, list-list, list-remove), which would require mentioning it's specifically for creation rather than retrieval or deletion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites, when not to use it, or reference sibling tools like list-get or list-remove for different operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list-getC
Gets information about the specific list
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Title of the list. | |
| webUrl | Yes | URL of the site where the list is located. | |
| withPermissions | No | Set if you want to return associated roles and permissions of the list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states 'Gets information', suggesting a read-only operation, but doesn't cover critical aspects like authentication requirements, rate limits, error handling, or what specific information is returned (e.g., metadata, content). For a tool with parameters and no output schema, this leaves significant gaps in understanding its behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence that directly states the tool's purpose without unnecessary words. It's front-loaded and efficient, though it could be slightly more informative (e.g., by hinting at sibling tools). There's no wasted verbiage, making it appropriately concise for a basic tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 3 parameters, no annotations, and no output schema, the description is incomplete. It doesn't explain what 'information' is retrieved, how to interpret parameters like 'withPermissions', or any behavioral traits. For a read operation with multiple inputs and no structured output, more context is needed to guide effective use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, fully documenting the three parameters (title, webUrl, withPermissions). The description adds no additional meaning beyond what the schema provides, such as explaining parameter relationships or usage context. With high schema coverage, the baseline score of 3 is appropriate, as the description doesn't compensate but also doesn't detract.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the tool 'Gets information about the specific list', which clearly indicates a read operation on a list resource. However, it doesn't differentiate from sibling tools like 'list-list' (likely for listing multiple lists) or 'list-add'/'list-remove' (for modifications), leaving the specific scope ambiguous. The purpose is understandable but lacks sibling distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance is provided on when to use this tool versus alternatives. The description implies it's for retrieving details of a specific list, but it doesn't clarify prerequisites (e.g., needing the list's title and webUrl), contrast with 'list-list' for broader queries, or mention any constraints. Usage is implied from the purpose but without actionable advice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list-listC
Gets all lists within the specified site
| Name | Required | Description | Default |
|---|---|---|---|
| webUrl | Yes | URL of the site where the lists to retrieve are located. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral disclosure. It states it 'Gets all lists' but doesn't mention whether this is a read-only operation, if it requires specific permissions, what format the output takes, or if there are rate limits. This leaves significant gaps for a tool that presumably returns multiple items.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence with no wasted words. It's appropriately sized for a simple tool and front-loads the essential information, making it highly efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of annotations and output schema, the description is incomplete. It doesn't explain what 'all lists' means in practice (e.g., pagination, filtering, or return format), which is crucial for a retrieval tool. The simplicity of the tool doesn't excuse these omissions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 100%, with the single parameter 'webUrl' well-documented in the schema. The description adds no additional parameter semantics beyond what's already in the schema, so it meets the baseline for adequate but unremarkable coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Gets') and resource ('all lists within the specified site'), making the tool's purpose understandable. However, it doesn't explicitly differentiate from sibling tools like list-get (which presumably retrieves a single list), so it doesn't reach the highest score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like list-get or list-add. It mentions the site scope but doesn't explain why one would choose this over other list-related tools, leaving the agent without contextual usage instructions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list-removeC
Removes the specified list
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Title of the list to remove. | |
| webUrl | Yes | URL of the site where the list to remove is located. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden but only states 'removes' without detailing behavioral traits. It doesn't disclose if this is destructive, requires permissions, has side effects, or what happens on success/failure, which is inadequate for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence with no wasted words, making it highly concise and front-loaded. It efficiently conveys the core action without unnecessary elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive tool with no annotations and no output schema, the description is incomplete. It lacks details on behavior, return values, error handling, or context compared to siblings, failing to compensate for the missing structured information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with descriptions for 'title' and 'webUrl' parameters. The tool description adds no additional meaning beyond the schema, such as format examples or constraints, so it meets the baseline but doesn't enhance understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the action ('removes') and resource ('the specified list'), which clarifies the tool's basic purpose. However, it's vague about what 'removes' entails (e.g., deletion, archiving) and doesn't differentiate from siblings like 'list-add' or 'list-get' beyond the verb, missing specificity about scope or effects.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. It doesn't mention prerequisites, exclusions, or compare to sibling tools like 'list-list' for listing or 'list-get' for retrieval, leaving the agent without context for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
v1.0.0- First observed
list-add - First observed
list-get - First observed
list-list - First observed
list-remove
TDQS
Scored across 4 tools
Each tool has a clearly distinct purpose targeting different CRUD operations on lists: create, retrieve specific, retrieve all, and delete. The descriptions explicitly differentiate them with no overlap or ambiguity.
All tools follow a perfect and consistent 'list-verb' pattern (list-add, list-get, list-list, list-remove) using hyphens and clear action verbs. This makes the naming highly predictable and readable.
With 4 tools, this server is well-scoped for managing lists in Microsoft 365 sites. Each tool earns its place by covering essential CRUD operations without bloat or missing core functionality.
The tool set provides complete CRUD/lifecycle coverage for lists: create (list-add), read specific (list-get), read all (list-list), and delete (list-remove). There are no obvious gaps for this focused domain.
Maintenance
Related MCP Connectors
Official Microsoft MCP Server to query Microsoft Entra data using natural language
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
MCP server for OpenAI API (chat completions, image generation, embeddings) via AceDataCloud
MCP server for generating rough-draft project plans from natural-language prompts.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceLokka ia an MCP server for the Microsoft Graph API and can be used to query and update all resources in your Microsoft 365 tenant. This MCP server supports all Microsoft Graph APIs including update operations (limited by the permissions you grant to the app).307MIT
- FlicenseCqualityFmaintenanceA powerful MCP server that enables AI assistants to interact with Microsoft Graph API for managing Outlook emails, Calendar events, OneDrive files, and Contacts through natural language commands.3556-
- AlicenseNot gradedqualityCmaintenanceA production-ready MCP server that provides secure, delegated access to Microsoft 365 services including Email, SharePoint, OneDrive, and Calendar. It enables AI models to search messages, browse files, manage calendar events, and parse document contents using OAuth 2.1 authentication.MIT
- AlicenseCqualityNot gradedmaintenanceAn MCP server that enables interaction with Microsoft 365 services like Outlook, OneDrive, Teams, and SharePoint via the Microsoft Graph API. It supports comprehensive operations including email management, file access, and organizational collaboration for personal and work accounts.78-