@aashari/mcp-server-atlassian-confluence
Version:
Node.js/TypeScript MCP server for Atlassian Confluence. Provides tools enabling AI systems (LLMs) to list/get spaces & pages (content formatted as Markdown) and search via CQL. Connects AI seamlessly to Confluence knowledge bases using the standard MCP in
89 lines (88 loc) • 3.09 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.applyJqFilter = applyJqFilter;
exports.toJsonString = toJsonString;
exports.toOutputString = toOutputString;
const jmespath_1 = __importDefault(require("jmespath"));
const logger_util_js_1 = require("./logger.util.js");
const toon_util_js_1 = require("./toon.util.js");
const logger = logger_util_js_1.Logger.forContext('utils/jq.util.ts');
/**
* Apply a JMESPath filter to JSON data
*
* @param data - The data to filter (any JSON-serializable value)
* @param filter - JMESPath expression to apply
* @returns Filtered data or original data if filter is empty/invalid
*
* @example
* // Get single field
* applyJqFilter(data, "name")
*
* // Get nested field
* applyJqFilter(data, "body.storage.value")
*
* // Get multiple fields as object
* applyJqFilter(data, "{id: id, title: title}")
*
* // Array operations
* applyJqFilter(data, "results[*].title")
*/
function applyJqFilter(data, filter) {
const methodLogger = logger.forMethod('applyJqFilter');
// Return original data if no filter provided
if (!filter || filter.trim() === '') {
methodLogger.debug('No filter provided, returning original data');
return data;
}
try {
methodLogger.debug(`Applying JMESPath filter: ${filter}`);
const result = jmespath_1.default.search(data, filter);
methodLogger.debug('Filter applied successfully');
return result;
}
catch (error) {
methodLogger.error(`Invalid JMESPath expression: ${filter}`, error);
// Return original data with error info if filter is invalid
return {
_jqError: `Invalid JMESPath expression: ${filter}`,
_originalData: data,
};
}
}
/**
* Convert data to JSON string for MCP response
*
* @param data - The data to stringify
* @param pretty - Whether to pretty-print the JSON (default: true)
* @returns JSON string
*/
function toJsonString(data, pretty = true) {
if (pretty) {
return JSON.stringify(data, null, 2);
}
return JSON.stringify(data);
}
/**
* Convert data to output string for MCP response
*
* By default, converts to TOON format (Token-Oriented Object Notation)
* for improved LLM token efficiency (30-60% fewer tokens).
* Falls back to JSON if TOON conversion fails or if useToon is false.
*
* @param data - The data to convert
* @param useToon - Whether to use TOON format (default: true)
* @param pretty - Whether to pretty-print JSON (default: true)
* @returns TOON formatted string (default), or JSON string
*/
async function toOutputString(data, useToon = true, pretty = true) {
const jsonString = toJsonString(data, pretty);
// Return JSON directly if TOON is not requested
if (!useToon) {
return jsonString;
}
// Try TOON conversion with JSON fallback
return (0, toon_util_js_1.toToonOrJson)(data, jsonString);
}