@nutrient-sdk/document-engine-mcp-server
Version:
MCP server for Nutrient Document Engine
115 lines (114 loc) • 5.67 kB
JavaScript
import { listDocuments, ListDocumentsSchema } from './tools/discovery/listDocuments.js';
import { readDocumentInfo, ReadDocumentInfoSchema } from './tools/discovery/readDocumentInfo.js';
import { extractText, ExtractTextSchema } from './tools/extraction/extractText.js';
import { search, SearchSchema } from './tools/extraction/search.js';
import { extractTables, ExtractTablesSchema } from './tools/extraction/extractTables.js';
import { renderDocumentPage, RenderDocumentPageSchema, } from './tools/extraction/renderDocumentPage.js';
import { extractFormData, ExtractFormDataSchema } from './tools/forms/extractFormData.js';
import { fillFormFields, FillFormFieldSchema } from './tools/forms/fillFormFields.js';
import { addAnnotation, AddAnnotationSchema } from './tools/annotations/addAnnotation.js';
import { splitDocument, SplitDocumentSchema } from './tools/document-editing/splitDocument.js';
import { addWatermark, AddWatermarkSchema } from './tools/document-editing/addWatermark.js';
import { createRedaction, CreateRedactionSchema } from './tools/annotations/createRedaction.js';
import { applyRedactions, ApplyRedactionsSchema } from './tools/annotations/applyRedactions.js';
import { healthCheck, HealthCheckSchema } from './tools/healthCheck.js';
import { readAnnotations, ReadAnnotationsSchema } from './tools/annotations/readAnnotations.js';
import { deleteAnnotations, DeleteAnnotationsSchema, } from './tools/annotations/deleteAnnotations.js';
import { duplicateDocument, DuplicateDocumentSchema, } from './tools/document-editing/duplicateDocument.js';
import { logger } from './utils/Logger.js';
import { extractKeyValuePairs, ExtractKeyValuePairsSchema, } from './tools/extraction/extractKeyValuePairs.js';
import { addNewPage, AddNewPageSchema } from './tools/document-editing/addNewPage.js';
import { mergeDocumentPages, MergeDocumentPagesSchema, } from './tools/document-editing/mergeDocumentPages.js';
import { rotatePages, RotatePagesSchema } from './tools/document-editing/rotatePages.js';
/**
* Wraps a tool function with entry/exit logging
*/
async function withLogging(toolName, extras, toolFn, client, params) {
let messagePrefix = `[${toolName}]`;
if (extras.sessionId)
messagePrefix += `[s=${extras.sessionId}]`;
if (extras.requestId)
messagePrefix += `[r=${extras.requestId}]`;
logger.info(`${messagePrefix} START`, params);
try {
const result = await toolFn(client, params);
logger.debug(`${messagePrefix} END`, result);
logger.info(`${messagePrefix} END`);
return result;
}
catch (error) {
logger.error(`${messagePrefix} END`, {
error: error instanceof Error ? error.message : String(error),
});
throw error;
}
}
/**
* Creates a tool handler with automatic logging
*/
function createToolHandler(toolFn) {
return (toolName) => async (client, params, extras) => {
const result = await withLogging(toolName, extras, toolFn, client, params);
// Create the content array with the markdown text
const textContent = {
type: 'text',
text: result.markdown,
};
// Create image content items
const imageContents = result.images
? result.images.map(image => ({
type: 'image',
data: image.base64,
mimeType: image.mimeType,
}))
: [];
// Combine text and image content
return {
content: [textContent, ...imageContents],
};
};
}
/**
* Helper function to create a tool definition with automatic handler creation
*/
function createTool(name, schema, toolFn) {
return {
name,
schema,
handler: createToolHandler(toolFn)(name),
};
}
/**
* Creates and returns the array of tools to register with the MCP server
* @param client The Document Engine client instance
* @returns Array of MCPTool objects
*/
export const mcpToolsToRegister = [
// Document Discovery
createTool('read_document_info', ReadDocumentInfoSchema, readDocumentInfo),
createTool('list_documents', ListDocumentsSchema, listDocuments),
// Extraction
createTool('search', SearchSchema, search),
createTool('extract_text', ExtractTextSchema, extractText),
createTool('extract_form_data', ExtractFormDataSchema, extractFormData),
createTool('extract_key_value_pairs', ExtractKeyValuePairsSchema, extractKeyValuePairs),
createTool('extract_tables', ExtractTablesSchema, extractTables),
createTool('render_document_page', RenderDocumentPageSchema, renderDocumentPage),
// Annotations
createTool('create_redaction', CreateRedactionSchema, createRedaction),
createTool('apply_redactions', ApplyRedactionsSchema, applyRedactions),
createTool('add_annotation', AddAnnotationSchema, addAnnotation),
createTool('read_annotations', ReadAnnotationsSchema, readAnnotations),
createTool('delete_annotations', DeleteAnnotationsSchema, deleteAnnotations),
// Forms
createTool('fill_form_fields', FillFormFieldSchema, fillFormFields),
// Document Editing
createTool('split_document', SplitDocumentSchema, splitDocument),
createTool('add_watermark', AddWatermarkSchema, addWatermark),
createTool('duplicate_document', DuplicateDocumentSchema, duplicateDocument),
createTool('add_new_page', AddNewPageSchema, addNewPage),
createTool('rotate_pages', RotatePagesSchema, rotatePages),
createTool('merge_document_pages', MergeDocumentPagesSchema, mergeDocumentPages),
// Miscellaneous
createTool('health_check', HealthCheckSchema, healthCheck),
];