PDF Content Search MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| PDF_CS_HOST | No | Host to reach the app | 127.0.0.1 |
| PDF_CS_PORT | No | Port of the app's API server | 44477 |
| PDF_CS_TOKEN | Yes | Bearer token matching the app's API Server token (required) |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| search_documentsA | Full-text search across all indexed PDF documents. Returns matching documents with snippets and match counts. |
| get_document_textA | Get the full OCR text content of a document. Returns text organized by page. |
| get_document_metadataA | Get metadata for a document: file name, path, page count, file size, processing state, and folder reference. |
| list_foldersA | List all indexed document folders with their IDs and paths. |
| list_folder_contentsB | List documents in a specific folder with processing state. Supports pagination. |
| get_processing_statusA | Get OCR processing statistics: total documents, counts by state (completed, not_processed, processing, error, etc.), per-folder breakdown. |
| get_document_thumbnailA | Get a PNG thumbnail of a specific document page. Returns base64-encoded image data. |
| export_documentsB | Export OCR text and metadata for multiple documents at once. Useful for bulk text extraction. |
| get_app_statusA | Get application health status, version, uptime, and active port. |
| get_ui_stateA | Get current UI state: selected document, list item count, search/browse mode, focused field. |
| get_search_stateA | Get the currently animated OCR hit rects on the document preview. Returns the active search text, per-rect page index, matched text, and the four corner points in normalized page coordinates [0.0..1.0] (origin top-left). Use this to debug highlights drawn outside the page bounds. |
| ui_searchA | Trigger a search in the app UI. Sets the search text and initiates the search, returning the result count. |
| ui_navigateC | Navigate in the document list: move up/down, jump to first/last, or go to a specific index. |
| ui_select_documentB | Select a specific document by ID or index in the current list. |
| ui_screenshotA | Take a screenshot of the main application window. Returns base64-encoded PNG image. |
| open_in_finderA | Reveal a document in macOS Finder by document_id or file_path. Only works when the app runs on the same Mac as the MCP client. |
| open_document_externalA | Open a document (by document_id or file_path) with the default macOS application, e.g. Preview for PDFs. Only works when the app runs on the same Mac as the MCP client. |
| reprocess_documentA | Re-queue a document for OCR processing. Useful when OCR failed or the document was updated. |
| rescan_folderA | Rescan a folder (by folder_id) for new or changed files. Initiates an asynchronous folder scan. |
| get_license_statusA | Get current license status: state (active/trial/grace/inactive/blocked), entitlement kind, expiration, days left, provider source, last sync date, and any issues. |
| refresh_licenseB | Refresh license status by re-syncing with the license server. Use force=true to bypass cache. |
| get_settingsA | Get current app settings. Specify a category or omit for all settings. |
| get_mail_message_metadataA | Read header and mailbox metadata for an Apple Mail message by RFC message-id. Requires Apple Mail indexing to be enabled. |
| open_in_apple_mailA | Open Apple Mail and jump to the message with the given RFC message-id. Only works when MCP client and app run on the same Mac. |
| get_mail_index_statusB | Returns Apple Mail indexer status: enabled flag, is_indexing, indexed_count, last_seen_rowid, envelope_index_path/readable, MailFtsSqlite db path. |
| get_mail_recentA | Returns the most recently indexed mails from MailFtsSqlite with subject/sender/date/snippet preview. |
| get_mail_mailboxesA | Returns mailbox-rowid + URL pairs from the Apple Mail Envelope Index for account-filter setup. |
| setup_apple_mailB | Configure Apple Mail indexing programmatically: bookmark mail_root (default ~/Library/Mail), optionally clear the index, set OCR size limit and account filter, then enable. Avoids the onboarding sheet entirely. |
| disable_apple_mailA | Disable Apple Mail indexing and remove the sidebar item. Index is kept on disk. |
| clear_mail_indexA | Wipe MailFtsSqlite rows and reset the indexer cursor to 0. Next index run will re-read from scratch. |
| reindex_apple_mailB | Trigger an indexer run. Pass restart=true to stop the current task first. |
| get_mail_full_index_statusA | Counters across all mailFtsMeta rows: success, empty, failed, pending. Use to verify completeness of Apple Mail index. |
| list_incomplete_mailsA | List Apple Mail records that are not 'success' (empty/failed/pending) with externalId, attemptCount, errorReason, envelopeRowid. |
| retry_incomplete_mailsA | Reset attemptCount and indexStatus='pending' for all non-success records and trigger an indexer run. Pulls newly-arrived .emlx bodies in. |
| cleanup_stale_mail_metaC | GC stale records: 'empty' with attemptCount>=10 older than 30 days, 'failed' older than 90 days. |
| list_mail_cloud_jobsA | List Office-attachment Cloud-Jobs (mailCloudJobs). Returns per-job docPortJobId, status, attemptCount, attachment metadata. Use status filter for slice. |
| retry_failed_mail_cloud_jobsA | Reset all 'failed' Office-attachment Cloud-Jobs to 'pending' with attemptCount=0, then trigger an immediate worker-tick. |
| cancel_pending_mail_cloud_jobsA | Cancel all 'pending' Office-attachment Cloud-Jobs (set status='notSupported', reason='user cancelled'). |
| tick_mail_cloud_workerA | Trigger an immediate MailCloudWorker tick (process downloaded/pending/polling jobs now instead of waiting for the 30-second timer). |
| get_mail_detailA | Full detail of an indexed mail by external-id (RFC message-id): header fields, mailbox, attachment list and indexed body/attachment text. |
| get_mail_by_rowidB | Peek at an indexed mail by its MailFtsSqlite rowid. Returns subject/sender/date/snippet for that single row. |
| reveal_mail_in_finderA | Reveal the .emlx file of an indexed mail in Finder (falls back to opening it in Apple Mail). Only works on the same Mac as the app. |
| list_mail_attachmentsA | List attachments of an indexed mail: external files from the Apple Mail Attachments folder plus inline MIME parts. Returns name, size, content_type and kind (external/inline). |
| get_mail_attachmentA | Fetch a single attachment of an indexed mail by name. Returns base64 by default; for large attachments pass save_to_path to write the file to disk instead of returning base64. |
| get_document_ocr_rectsA | Get OCR bounding boxes for a document: per-rect page index, recognised text and x/y/width/height in normalized page coordinates. Optionally filter by page. |
| get_folder_statsA | Get aggregate stats for a folder: total documents, total pages and a breakdown by processing state. |
| get_folder_processing_statusA | Get the OCR processing status of a folder: whether it is currently processing plus counts for processing/pending/completed/failed. |
| get_processing_progressA | Get the live OCR processing progress: is_processing flag, total/processed item counts and progress percent. |
| list_recent_scansA | List recently scanned items with file name/path/type, creation date and read state. |
| get_unread_scan_countA | Get the number of recently scanned items not yet marked as read. |
| mark_scan_as_readB | Mark a recent scan item as read by its scan ID. |
| add_folderA | Add a folder to the indexed search folders by absolute path. The path must exist and be a directory. |
| delete_folderA | Remove a folder (by folder_id) from the index. Destructive. Requires confirm=true. |
| delete_documentA | Delete a single document (by document_id) from the index. Destructive. Requires confirm=true. |
| bulk_delete_documentsA | Delete multiple documents (document_ids) from the index at once. Destructive. Requires confirm=true. |
| patch_settings_searchB | Update search settings. Accepted fields: case_sensitive, fuzzy_search, whole_word, max_results, search_in_filenames, highlight_matches, auto_search, snippet_length, exclude_patterns, min_query_length. |
| patch_settings_processingB | Update OCR/processing settings. Accepted fields: ocr_enabled, ocr_language, auto_process_new, max_concurrent_tasks, process_images, process_pdfs, thumbnail_quality, ocr_quality, max_file_size_mb. |
| patch_settings_appearanceC | Update appearance settings. Accepted fields: theme, accent_color, sidebar_visible, list_density, show_thumbnails, font_size, grid_view. |
| patch_settings_sharingC | Update mobile-sharing settings. Accepted fields: enabled, require_approval, share_name, max_devices, auto_accept_known, read_only, sharee_key. |
| ui_list_itemsA | List the items currently shown in the app's document list. |
| ui_get_zoomA | Get the document preview zoom state: zoom_level, min/max zoom and fit_mode. |
| ui_set_zoomB | Set the document preview zoom. Pass zoom_level (a value between min and max) and/or fit_mode. |
| ui_get_pageA | Get the current page state of the document preview: current_page and total_pages. |
| ui_set_pageA | Navigate the document preview. Pass action (first/prev/next/last) or page (1-based page number). |
| ui_get_transcriptA | Get the transcript panel state: visible flag and mode. |
| ui_set_transcriptA | Set the transcript panel. Pass visible (bool) and/or mode (e.g. split / searchResults). |
| ui_get_sortA | Get the current list sort order plus the list of available sort orders. |
| ui_set_sortA | Set the list sort order. Pass sort with one of the values returned by ui_get_sort (e.g. relevance / new2Old / old2New / a2z / z2a). |
| ui_get_filtersA | Get the active list filters: file_types, date_range and folders. |
| ui_set_filtersA | Set list filters. Pass file_types (array), date_range (string) and/or clear=true to reset all filters first. |
| ui_get_popupsA | List the popups/sheets currently presented in the app UI. |
| ui_dismiss_popupB | Dismiss a presented popup/sheet in the app UI. |
| ui_list_alertsA | List the NSAlerts currently shown by the app: title, message, window and button titles. |
| ui_dismiss_alertA | Dismiss active app alerts. Pass button_title or button_index to click a specific button, or dismiss_all=true to close every open alert. |
| activate_licenseA | Activate a license using license_key. Sensitive. Requires confirm=true. |
| deactivate_licenseA | Deactivate the current license. Sensitive. Requires confirm=true. |
| request_trialA | Start a trial period. Sensitive. Requires confirm=true. |
| get_cloud_statusA | Get cloud-service status: enabled flag, conditions_accepted, number of scanned folders and item counts by state. |
| list_cloud_itemsA | List cloud-service items across all folders with file path, folder, state and modification date. Optionally filter by state. |
| cloud_syncA | Control the cloud service. Pass enabled to toggle it (requires accept_conditions=true once), or omit to run a cleanup of completed items. |
| get_mobile_sync_statusA | Get mobile-sync status: number of connected folders, HTTP folders and polling state. |
| list_mobile_devicesA | List folders shared with mobile devices including backend, client identifier and last sync timestamps. |
| mobile_syncB | Trigger a mobile sync. Pass folder_path to sync a single connected folder, or omit to sync all. |
| confirm_mobile_pairingA | Confirm a mobile-device pairing using the 9-digit code. Sensitive. Requires confirm=true. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
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/juergenkoller-software/pdf-content-search-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server