MCP Server - Connect with you LLM
Overview: MCP server
The MCP server at https://mcp.cxplanner.com exposes CxPlanner tools over streamable HTTP using the same authentication model as the REST API, which is used when you want an LLM or automation client to call structured tools instead of raw REST endpoints.
For creating API credentials, see Set up API access.
- Your role must be company Admin to configure or test MCP connections.
- You can find the endpoint at
https://mcp.cxplanner.com. - This lets clients call MCP tools. It does not change project data unless a tool performs a write action allowed by your token.
Authentication uses the same Bearer token and projectID rules as the REST API. Rate limits match REST. A Mcp-Session-Id is issued on initialize and must be echoed by the client. Project-aware tools may require a projectID parameter.
How to connect to the MCP server
- Set the base endpoint to
https://mcp.cxplanner.com. - Authenticate with the same Bearer token and projectID used for REST.
- Call
initializeand capture theMcp-Session-Id. - Call
tools/listto confirm available tools. - Call a tool with
tools/call. - Test with
pingand arguments{ "message": "hello" }.
Examples:
- Global API tool:
get_users_on_platform(no parameters) - Project API tool:
get_users(requiresprojectID)
Results: MCP tools
Tool | Purpose |
|---|---|
initialize | Starts a session and returns a session ID |
tools/list | Lists available tools |
tools/call | Executes a specific tool |
ping | Tests connectivity with a message response |
Troubleshooting: MCP server
Problem | Cause | Solution |
|---|---|---|
401 Unauthorized | Missing or invalid Bearer token | Check the token, include projectID when required, and retry |
Tool not found | Incorrect tool name | Call |
Request rate limited | Same REST rate limit applied to MCP | Slow down calls or batch requests |
No session ID returned |
| Run |
Example code
const endpoint = 'https://mcp.cxplanner.com';
async function mcp(method, params = {}, id = String(Date.now())) {
const res = await fetch(endpoint, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
jsonrpc: '2.0',
method,
params,
id,
}),
});
if (!res.ok) {
const text = await res.text().catch(() => '');
throw new Error(`HTTP ${res.status} ${res.statusText}: ${text}`);
}
return res.json();
}
// Example: initialize
(async () => {
try {
const resp = await mcp('initialize');
console.log('initialize →', resp);
} catch (err) {
console.error(err);
}
})();
// Example: list tools
(async () => {
try {
const resp = await mcp('tools/list');
console.log('tools/list →', resp);
} catch (err) {
console.error(err);
}
})();
// Example: call tool
(async () => {
try {
const resp = await mcp('tools/call', { name: 'get_users_on_platform', arguments: { bearerToken: 'xxxxx' } });
console.log('tools/call →', resp);
} catch (err) {
console.error(err);
}
})();
Updated on: 07/26/2026
Thank you!