Skip to main content
Glama
aashari

Atlassian Confluence MCP Server

by aashari

conf_get

Retrieve Confluence data from API endpoints using path parameters and optional filters to extract specific information efficiently.

Instructions

Read any Confluence data. Returns TOON format by default (30-60% fewer tokens than JSON).

IMPORTANT - Cost Optimization:

  • ALWAYS use jq param to filter response fields. Unfiltered responses are very expensive!

  • Use limit query param to restrict result count (e.g., limit: "5")

  • If unsure about available fields, first fetch ONE item with limit: "1" and NO jq filter to explore the schema, then use jq in subsequent calls

Schema Discovery Pattern:

  1. First call: path: "/wiki/api/v2/spaces", queryParams: {"limit": "1"} (no jq) - explore available fields

  2. Then use: jq: "results[*].{id: id, key: key, name: name}" - extract only what you need

Output format: TOON (default, token-efficient) or JSON (outputFormat: "json")

Common paths:

  • /wiki/api/v2/spaces - list spaces

  • /wiki/api/v2/pages - list pages (use space-id query param)

  • /wiki/api/v2/pages/{id} - get page details

  • /wiki/api/v2/pages/{id}/body - get page body (body-format: storage, atlas_doc_format, view)

  • /wiki/rest/api/search - search content (cql query param)

JQ examples: results[*].id, results[0], results[*].{id: id, title: title}

API reference: https://developer.atlassian.com/cloud/confluence/rest/v2/

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
pathYesThe Confluence API endpoint path (without base URL). Must start with "/". Examples: "/wiki/api/v2/spaces", "/wiki/api/v2/pages", "/wiki/api/v2/pages/{id}"
queryParamsNoOptional query parameters as key-value pairs. Examples: {"limit": "25", "cursor": "...", "space-id": "123", "body-format": "storage"}
jqNoJMESPath expression to filter/transform the response. IMPORTANT: Always use this to extract only needed fields and reduce token costs. Examples: "results[*].{id: id, title: title}" (extract specific fields), "results[0]" (first result), "results[*].id" (IDs only). See https://jmespath.org
outputFormatNoOutput format: "toon" (default, 30-60% fewer tokens) or "json". TOON is optimized for LLMs with tabular arrays and minimal syntax.

Implementation Reference

  • Registers the 'conf_get' MCP tool with the server, providing title, description reference, input schema (GetApiToolArgs), and the 'get' handler function.
    server.registerTool(
    	'conf_get',
    	{
    		title: 'Confluence GET Request',
    		description: CONF_GET_DESCRIPTION,
    		inputSchema: GetApiToolArgs,
    	},
    	get,
    );
  • Zod schema definition for 'conf_get' tool input arguments: path (required), optional queryParams, jq filter, outputFormat. Base schema used by GetApiToolArgs.
    const BaseApiToolArgs = {
    	/**
    	 * The API endpoint path (without base URL)
    	 * Examples:
    	 * - "/wiki/api/v2/spaces" - list spaces
    	 * - "/wiki/api/v2/spaces/{id}" - get space
    	 * - "/wiki/api/v2/pages" - list/create pages
    	 * - "/wiki/api/v2/pages/{id}" - get page
    	 * - "/wiki/api/v2/pages/{id}/body" - get page body
    	 */
    	path: z
    		.string()
    		.min(1, 'Path is required')
    		.describe(
    			'The Confluence API endpoint path (without base URL). Must start with "/". Examples: "/wiki/api/v2/spaces", "/wiki/api/v2/pages", "/wiki/api/v2/pages/{id}"',
    		),
    
    	/**
    	 * Optional query parameters as key-value pairs
    	 */
    	queryParams: z
    		.record(z.string(), z.string())
    		.optional()
    		.describe(
    			'Optional query parameters as key-value pairs. Examples: {"limit": "25", "cursor": "...", "space-id": "123", "body-format": "storage"}',
    		),
    
    	/**
    	 * Optional JMESPath expression to filter/transform the response
    	 * IMPORTANT: Always use this to reduce response size and token costs
    	 */
    	jq: z
    		.string()
    		.optional()
    		.describe(
    			'JMESPath expression to filter/transform the response. IMPORTANT: Always use this to extract only needed fields and reduce token costs. Examples: "results[*].{id: id, title: title}" (extract specific fields), "results[0]" (first result), "results[*].id" (IDs only). See https://jmespath.org',
    		),
    
    	/**
    	 * Output format for the response
    	 * Defaults to TOON (token-efficient), can be set to JSON if needed
    	 */
    	outputFormat: OutputFormat,
    };
    
    /**
     * Body field for requests that include a request body (POST, PUT, PATCH)
     */
    const bodyField = z
    	.record(z.string(), z.unknown())
    	.describe(
    		'Request body as a JSON object. Structure depends on the endpoint. Example for page: {"spaceId": "123", "title": "Page Title", "body": {"representation": "storage", "value": "<p>Content</p>"}}',
    	);
    
    /**
     * Schema for conf_get tool arguments (GET requests - no body)
     */
    export const GetApiToolArgs = z.object(BaseApiToolArgs);
    export type GetApiToolArgsType = z.infer<typeof GetApiToolArgs>;
  • Factory function that creates the MCP-compatible handler for 'conf_get' (GET requests). Takes args, calls controller's handleGet, truncates output for AI, returns MCP content format or error.
    function createReadHandler(
    	methodName: string,
    	handler: (
    		options: GetApiToolArgsType,
    	) => Promise<{ content: string; rawResponsePath?: string | null }>,
    ) {
    	return async (args: Record<string, unknown>) => {
    		const methodLogger = Logger.forContext(
    			'tools/atlassian.api.tool.ts',
    			methodName.toLowerCase(),
    		);
    		methodLogger.debug(`Making ${methodName} request with args:`, args);
    
    		try {
    			const result = await handler(args as GetApiToolArgsType);
    
    			methodLogger.debug(
    				'Successfully retrieved response from controller',
    			);
    
    			return {
    				content: [
    					{
    						type: 'text' as const,
    						text: truncateForAI(
    							result.content,
    							result.rawResponsePath,
    						),
    					},
    				],
    			};
    		} catch (error) {
    			methodLogger.error(`Failed to make ${methodName} request`, error);
    			return formatErrorForMcpTool(error);
    		}
    	};
    }
  • Controller handler specifically for GET requests (used by conf_get tool). Delegates to shared handleRequest which performs API call, JQ filtering, and output formatting.
    export async function handleGet(
    	options: GetApiToolArgsType,
    ): Promise<ControllerResponse> {
    	return handleRequest('GET', options);
    }
  • Core helper function that executes the HTTP request via Atlassian API service, applies JMESPath (jq) filtering, converts to TOON/JSON format, and handles errors. Used by all conf_* tools including conf_get.
    async function handleRequest(
    	method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE',
    	options: RequestWithBodyOptions,
    ): Promise<ControllerResponse> {
    	const methodLogger = logger.forMethod(`handle${method}`);
    
    	try {
    		methodLogger.debug(`Making ${method} request`, {
    			path: options.path,
    			...(options.body && { bodyKeys: Object.keys(options.body) }),
    		});
    
    		// Call the service layer (returns TransportResponse with data and rawResponsePath)
    		const response = await atlassianApiService.request<unknown>(
    			options.path,
    			{
    				method,
    				queryParams: options.queryParams,
    				body: options.body,
    			},
    		);
    
    		methodLogger.debug('Successfully received response from service');
    
    		// Apply JQ filter if provided, otherwise return raw data
    		const result = applyJqFilter(response.data, options.jq);
    
    		// Convert to output format (TOON by default, JSON if requested)
    		const useToon = options.outputFormat !== 'json';
    		const content = await toOutputString(result, useToon);
    
    		return {
    			content,
    			rawResponsePath: response.rawResponsePath,
    		};
    	} catch (error) {
    		throw handleControllerError(error, {
    			entityType: 'API',
    			operation: `${method} request`,
    			source: `controllers/atlassian.api.controller.ts@handle${method}`,
    			additionalInfo: { path: options.path },
    		});
    	}
    }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/aashari/mcp-server-atlassian-confluence'

If you have feedback or need assistance with the MCP directory API, please join our Discord server