IBM Content Services MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| SCOPE | No | OAuth scope | |
| PASSWORD | No | Authentication password | |
| USERNAME | No | Authentication username | |
| CLIENT_ID | No | OAuth client ID | |
| LOG_LEVEL | No | Logging level: DEBUG, INFO, WARNING, ERROR, CRITICAL (default INFO) | |
| TOKEN_URL | No | OAuth token URL | |
| GRANT_TYPE | No | OAuth grant type | |
| SERVER_URL | No | Content Services GraphQL API endpoint URL | |
| SSL_ENABLED | No | Whether SSL is enabled. Can be 'true', a path to a certificate file, or 'false'. | |
| OBJECT_STORE | No | Object store identifier | |
| POOL_MAXSIZE | No | Maximum pool size (default 100) | |
| CLIENT_SECRET | No | OAuth client secret | |
| TOKEN_REFRESH | No | Token refresh interval in seconds (default 1800) | |
| ZENIAM_IAM_URL | No | IAM url to get IAM token | |
| ZENIAM_ZEN_URL | No | Zen url to exchange IAM token to Zen token | |
| REQUEST_TIMEOUT | No | Request timeout in seconds (default 30.0) | |
| ZENIAM_IAM_USER | No | IAM user if grant type is password | |
| POOL_CONNECTIONS | No | Number of connection pool connections (default 100) | |
| RESOURCES_FOLDER | No | Folder path in the repository containing documents to expose as MCP resources | |
| ZENIAM_CLIENT_ID | No | IAM client id if grant type is client_credentials | |
| ZENIAM_IAM_SCOPE | No | IAM scope | |
| TOKEN_SSL_ENABLED | No | Whether SSL is enabled for token endpoint. Can be 'true', a path, or 'false'. | |
| ZENIAM_IAM_PASSWORD | No | IAM password if grant type is password | |
| ZENIAM_CLIENT_SECRET | No | IAM client secret if grant type is client_credentials | |
| ZENIAM_IAM_GRANT_TYPE | No | IAM grant type | |
| ZENIAM_IAM_SSL_ENABLED | No | Whether SSL is enabled for IAM route | |
| ZENIAM_ZEN_SSL_ENABLED | No | Whether SSL is enabled for Zen exchange route | |
| RESOURCES_PREFIX_VALIDATION | No | Controls prefix validation for resource documents: strict, warn, off (default warn) |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| extensions | {
"io.modelcontextprotocol/ui": {}
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_document_versionsA | Retrieves all versions in the version series that includes the specified document. This returns all versions (past, current, and future) that belong to the same version series. :param identifier: The document id or path (required). This can be either the document's ID (GUID) or its path in the repository (e.g., "/Folder1/document.pdf"). :returns: A dictionary containing the version series details, including: - versionSeries (dict): A dictionary containing version series details, including: - versions (list): A list of all versions in the series, with each version containing: - versionables (list): A list of versionable objects, each containing: - majorVersionNumber (int): The major version number. The format to print out version number is majorVersionNumber.minorVersionNumber. - minorVersionNumber (int): The minor version number. The format to print out version number is majorVersionNumber.minorVersionNumber. - id (str): The unique identifier of the version's document id. |
| get_document_text_extractA | Retrieves a document's text extract content. :param identifier: The document id or path (required). This can be either the document's ID (GUID) or its path in the repository (e.g., "/Folder1/document.pdf"). :returns: The text content of the document's text extract annotation. If multiple text extracts are found, they will be concatenated. Returns an empty string if no text extract is found. |
| create_documentA | PREREQUISITES IN ORDER: To use this tool, you MUST call two other tools first in a specific sequence.
Description: Creates a document in the content repository with specified properties. :param class_identifier: The class identifier for the document. If not provided, defaults to "Document". :param id: The unique GUID for the document. If not provided, a new GUID with curly braces will be generated. :param document_properties: Properties for the document including name, content, mimeType, etc. :param file_in_folder_identifier: The identifier or path of the folder to file the document in. This always starts with "/". :param checkin_action: Check-in action parameters. CheckinMinorVersion should always be included. :param file_paths: Optional list of file paths to upload as the document's content. :returns: If successful, returns a Document object with its properties. If unsuccessful, returns a ToolError with details about the failure. |
| update_document_propertiesA | PREREQUISITES: Before using this tool, you MUST call ONE of these tools first:
Description: Updates an existing document's properties in the content repository. This tool ONLY updates properties and does NOT change the document's class. To change a document's class, use the update_document_class tool instead. :param identifier: The document id or path (required). This can be either the document's ID (GUID) or its path in the repository (e.g., "/Folder1/document.pdf"). :param document_properties: Properties to update for the document including name, mimeType, etc. :returns: If successful, returns a Document object with its updated properties. If unsuccessful, returns a ToolError with details about the failure. |
| update_document_classA | PREREQUISITES: Before using this tool, you MUST call ONE of these tools first:
Description: Changes a document's class in the content repository. WARNING: Changing a document's class can result in loss of properties if the new class does not have the same properties as the old class. Properties that don't exist in the new class will be removed from the document. This tool ONLY changes the document's class and does NOT update any properties. To update properties after changing the class, use the update_document_properties tool. :param identifier: The document id or path (required). This can be either the document's ID (GUID) or its path in the repository (e.g., "/Folder1/document.pdf"). :param class_identifier: The new class identifier for the document (required). :returns: If successful, returns a Document object with the new class. If unsuccessful, returns a ToolError with details about the failure. |
| checkin_documentB | Checks in a document in the content repository with specified properties. :param identifier: The identifier (required). This can be either a reservation_id or document_id. Reservation ID (GUID) is prioritized. Otherwise, we use document_id (GUID). :param checkin_action: Check-in action parameters for the document. :param document_properties: Properties to update for the document during check-in. :param file_paths: Optional list of file paths to upload as the document's content. :returns: If successful, returns a Document object with its updated properties. If unsuccessful, returns a ToolError with details about the failure. |
| checkout_documentA | Checks out a document in the content repository. :param identifier: The document id or path (required). This can be either the document's ID (GUID) or its path in the repository (e.g., "/Folder1/document.pdf"). :param document_properties: Properties to update for the document during check-out. :param checkout_action: Check-out action parameters for the document. :param download_folder_path: Optional path to a folder where the document content will be downloaded. If not provided but content download is needed, the user will be prompted to provide it. :returns: If successful, returns a Document object with its updated properties. If unsuccessful, returns a ToolError with details about the failure. |
| delete_version_seriesA | Deletes an entire version series (all versions of a document) in the content repository. :param version_series_id: The version series ID (GUID) to delete. If you don't have the version series ID, first call get_document_property on the document to get the version series ID. :returns: If successful, returns the deleted version series ID as a string. If unsuccessful, returns a ToolError with details about the failure. |
| delete_document_versionA | Deletes a specific document version in the content repository. :param identifier: The document id or path (required). This can be either the document's ID (GUID) or its path in the repository (e.g., "/Folder1/document.pdf"). :returns: If successful, returns the deleted Document id. If unsuccessful, returns a ToolError with details about the failure. |
| get_document_propertiesA | Retrieves a document's properties from the content repository by ID or path. Note: Use this tool ONLY when you need to retrieve a document using its ID or file path. For searching documents by other properties, use the repository_search tool instead. :param identifier: The document id or path (required). This can be either the document's ID (GUID) or its path in the repository (e.g., "/Folder1/document.pdf"). :returns: If successful, returns the Document object with its properties. If unsuccessful, returns a ToolError with details about the failure. |
| download_document_contentA | Downloads a document's original content (e.g., the raw PDF file) from the content repository to a local folder WITHOUT checking the document out. This is a read-only operation: it places NO reservation/lock on the document, so no checkin_document or cancel_document_checkout call is needed afterwards. Use this tool when the original file bytes are needed (e.g., for downstream image or PDF processing) rather than the extracted text. :param identifier: The document id or path (required). This can be either the document's ID (GUID) or its path in the repository (e.g., "/Folder1/document.pdf"). :param download_folder_path: Path to the folder where the document content will be saved (required). The folder is created if it does not exist. :returns: If successful, returns a dictionary containing: - document_id (str): The document's ID. - files (list): One entry per downloaded content element, each containing: - file_path (str): The full path of the downloaded file. - retrieval_name (str): The content element's original file name. - content_type (str): The MIME type of the content. - content_size (int): The size of the content in bytes. If unsuccessful, returns a ToolError with details about the failure. |
| get_document_pdf_textA | Extracts the embedded text of a PDF document directly from its content bytes. Unlike get_document_text_extract (which depends on text extract annotations created by the repository's text extraction service), this tool downloads the PDF content in memory and extracts its embedded text layer directly. It is read-only: no reservation/lock is placed and nothing is written to disk. Use it when a PDF's text is needed but no text extract annotation exists. Note: scanned PDFs with no embedded text layer will return empty pages — those require OCR or a vision model instead. :param identifier: The document id or path (required). This can be either the document's ID (GUID) or its path in the repository (e.g., "/Folder1/document.pdf"). :returns: If successful, returns a dictionary containing: - document_id (str): The document's ID. - page_count (int): Number of pages in the PDF. - characters (int): Total characters extracted. - text (str): The extracted text, with pages separated by form-feed markers. If unsuccessful, returns a ToolError with details about the failure. |
| cancel_document_checkoutA | Cancels a document checkout in the content repository. :param identifier: The identifier (required). This can be either a reservation_id or document_id. Reservation ID (GUID) is prioritized. Otherwise, we use document_id (GUID). :returns: If successful, returns a Document object with its updated properties. If unsuccessful, returns a ToolError with details about the failure. |
| document_searchA | PREREQUISITES IN ORDER: To use this tool, you MUST call two other tools first in a specific sequence.
Description: This tool will execute a request to search for documents based on content and the metadata criteria. :param search_term: The words for CBR search. This will be used to search for documents based on their CBR indexed content and metadata If empty string or None, then only search by metadata. :param search_parameters (SearchParameters): provide parameters search_class and addiontal search conditions. Note the search_class is filled in by determine_class tool. search_properties inside search_parameters include any property being searched for and any search conditions. Note: additional properties beside the search_class are used to narrow down the result set, not to expand the result set, ie it does not make sense to support prompt such as: get me all XXXCBRDocClass documents that are created by XXXuser OR contains 'XXX Content' . For CBR, Content search will be carried out first to get a result set and additional properties are placed on this result set to narrow it down. :returns: the released versions of documents that fit the search criteria. - if search by content and CBR is not enabled, tool will return a ToolError. Example of search by content and class is CBR enabled: Prompt: get me all XXXCBRDocClass documents that are created by XXXuser and contains 'XXX Content' Request: { "doc_class": "XXXCBRDocClass", "max_results": 50, "search_parameters": { "search_class": "XXXCBRDocClass", "search_properties": [ { "operator": "=", "property_name": "Creator", "property_value": "XXXuser" } ] }, "search_term": "XXX Content" } |
| create_folderA | PREREQUISITES IN ORDER: To use this tool, you MUST call two other tools first in a specific sequence.
Creates a folder in the content repository with specified properties. This tool interfaces with the GraphQL API to create a new folder object with the provided parameters. :param name string Yes The name of the folder to be created. :param parent_folder string Yes The identifier of the parent folder where this folder will be created. :param class_identifier string No The class identifier for the folder. If not provided, defaults to "Folder". :param id string No The unique identifier for the folder. If not provided, a new UUID with curly braces will be generated (format: {uuid}). :param folder_properties FolderPropertiesInput No properties of to set. :returns: If successful, return a folder object with the following properties: id: The identifier of the created folder name: The name of the folder parent_folder: The identifier of the parent folder creator: The user who created the folder class_identifier: The class identifier of the folder Else, return a ToolError instance that describes the error. |
| delete_folderA | Deletes a folder in the content repository. This tool interfaces with the GraphQL API to delete a folder object with the provided id. :param id_or_path string Yes The unique identifier or path for the folder. If not provided, an error will be returned. :returns: If successful, return the folder id. Else, return a ToolError instance that describes the error. |
| unfile_documentA | Unfile a document from a folder in the content repository. This tool interfaces with the GraphQL API to unfile document from folder with the provided ids. :param folder_id_or_path string Yes The unique identifier or path for the folder. If not provided, an error will be returned. :param document_id string Yes The unique identifier for the document. If not provided, an error will be returned. :returns: If successful, return the folder id. Else, return a ToolError instance that describes the error. |
| file_documentA | File a document to a folder in the content repository. This tool interfaces with the GraphQL API to create a referential containment relationship between a document and a folder. :param document_id_or_path string Yes The unique identifier or path for the document. :param folder_id_or_path string Yes The unique identifier or path for the folder. :returns: If successful, returns the reference containment relationship ID Else, return a ToolError instance that describes the error. |
| update_folderA | PREREQUISITES IN ORDER: To use this tool, you MUST call two other tools first in a specific sequence.
Description: Updates an existing folder in the content repository with specified properties. :param identifier: String The folder identifier or path (required). This can be either the folder's ID (GUID) or its path in the repository (e.g., "/Folder1/folder123"). :param class_identifier: String Optional. The class identifier for the folder. If provided, allows changing the folder's class. :param folder_properties: FolderPropertiesInput Properties to update for the folder including name, etc :returns: If successful, returns a Folder object with its updated properties. If unsuccessful, returns a ToolError with details about the failure. |
| get_folder_documentsB | Retrieves a folder's contained documents. :param folder_id_or_path: The folder id or path. :returns: A list contains documents in the folder |
| get_folder_detailC | Description: Get an existing folder in the content repository information given a folder id :param identifier: The folder identifier (required). This can be either the folder's ID (GUID). :param folder_properties: Properties to update for the folder including name, etc :returns: If successful, returns a Folder object with its properties. If unsuccessful, returns a ToolError with details about the failure. |
| list_root_classesA | List all available root class types in the repository. This tool should be called first to get a list of valid root class names before using the list_all_classes tool. :returns: A list of all available root class types (e.g., ["Document", "Folder", "Annotation", "CustomObject"]) |
| determine_classA | Find classes that match the given keywords by looking for substring matches in class names and descriptions. IMPORTANT:
To get a list of all valid class names that can be used with this tool, you MUST first call the :param root_class: The root class to search within (eg. "Document", "Folder") :param keywords: Up to 3 words from the user's message that might contain the class's name :returns: A list of up to 3 matching classes with their scores, or a ToolError if no matches are found Each match is a ClassMatch object with class_name and score fields |
| get_class_property_descriptionsA | Retrieves ALL properties of a class including system properties. IMPORTANT: Use this tool ONLY for general document updates where you need to see ALL properties of a class, including system-owned and hidden properties. DO NOT use this tool for property extraction workflows. :param class_symbolic_name: The symbolic name of the class to retrieve properties for :returns: A list of CachePropertyDescription objects for each property (including system properties) |
| get_searchable_property_descriptionsA | Retrieves only the searchable properties of a class. :param class_symbolic_name: The symbolic name of the class to retrieve searchable properties for :returns: A list of CachePropertyDescription objects for properties that are searchable |
| repository_object_searchA | PREREQUISITES IN ORDER: To use this tool, you MUST call two other tools first in a specific sequence.
Description: This tool retrieves repository objects other than Document instances. :param search_parameters (SearchParameters): parameters for the searching including the object being searched for and any search conditions. :returns: A the repository object details, including: - repositoryObjects (dict): a dictionary containing independentObjects: - independentObjects (list): A list of independent objects, each containing: - properties (list): A list of properties, each containing: - label (str): The name of the property. - value (str): The value of the property. |
| lookup_documents_by_nameA | :param keywords: Up to 3 words from the user's message that might contain the document's name. Avoid using very common words such as "and", "or", "the", etc. :param class_symbolic_name: If specified, a specific document class to look in for matching documents. The root Document class is used by default. Specify a class only if the user indicates that the documents should belong to a specific class. Use the determine_class tool to lookup the class symbolic name based on the user's message. :returns: A list of matching documents, or a ToolError if no matches are found or there is some other problem. Each match is a DocumentMatch object with information about the document including its name and a confidence score. Description: This tool will execute a search to lookup documents by name. A list of the most likely documents matching the keywords is returned. Use this list to select the appropriate document based on the user's message. |
| lookup_documents_by_pathA | PREREQUISITE: To use this tool, you MUST call the determine_class tool first to get the class_symbolic_name. If the user does not specify a specific clas then call determine_class with the root Document class. :param keywords_at_path_levels: A list of lists of keywords to search for at each path level. The first dimension list is the number of path levels entered by the user. For each path level a sub list contains up to 3 words from the user's message for that level that might contain either the intermediate folder name or the actual document's containment name. Avoid using very common words such as "and", "or", "the", etc. for these keywords. Note that the matching of documents by path is based on the containment names of the documents filed in the folder, not the name of the documents themselves. The containment names of documents are usually the same or similar to the documents but they can be different in some scenarios. :param class_symbolic_name: If specified, a specific document class to look in for matching documents. The root Document class is used by default. Specify a class only if the user indicates that the documents should belong to a specific class. :returns: A list of matching document filings, or a ToolError if no matches are found or if there is some other problem. Each match is a DocumentMatch object with information about the document filing including its name. Description: This tool will execute a search to lookup documents based on where they are filed in a folder hierarchy. One indication that a lookup by path is appropriate rather than a more basic lookup by name is if the user has used a path separator character ('/') to describe the document. A list of the most likely documents matching the keywords is returned. Use this list to select the appropriate document based on the user's message. |
| map_easement_to_parcelA | Places an easement survey traverse onto real-world map coordinates and returns GeoJSON. The traverse (from the survey's line table or prose metes-and-bounds courses) is chained and closure-checked, then anchored to the ground using county parcel and/or PLSS section GIS data. This tool performs no repository operations — it is a pure geospatial computation using public county GIS data. :param line_table_json: JSON array of the traverse courses in order, e.g.
'[{"line": "L1", "bearing": "S00-07-32E", "distance_ft": 10.30}, ...]'.
Bearings accept degree symbols or dashes (N89°51'34"E or N89-51-34E).
:param apn: Assessor's Parcel Number as printed (e.g. "200-18-001S"). Optional if
address or subdivision+lot is given, or when pob_anchor="section_corner".
:param address: Street address printed in the document (e.g. "6361 S Power Rd") —
alternative way to find the parcel when the APN is missing or illegible.
:param subdivision: Subdivision/plat name (e.g. "Sundance Groves") — used with :returns: If successful, returns a dictionary containing: - summary (dict): flat result fields — report these values verbatim. - geojson_io_url (str): ready-made link opening the exact polygons on an interactive map. Present as a link; NEVER re-type coordinates. - geojson (dict): full-precision FeatureCollection for programmatic consumers only — do not reproduce it in a chat response. If unsuccessful, returns a ToolError with details about the failure. |
| extract_survey_dataA | Reads an easement document with a vision model and returns the structured survey data needed to map it — regardless of whether the document is a clean text PDF, an OCR-quality scan, or a pure image scan. The document's pages are rendered to images in memory and read by the model; nothing is written to disk and no lock is placed on the document. Call this INSTEAD of parsing document text yourself. Pass its outputs directly to map_easement_to_parcel (the *_json fields are pre-formatted for that tool's parameters). :param identifier: The document id or path (required). GUID or repository path. :returns: If successful, returns a dictionary containing: - line_table (list) and line_table_json (str, ready for map_easement_to_parcel) - closure_ok (bool), closure_gap_ft, closure_perimeter_ft — arithmetic check of the extracted courses; if false, treat extraction as unreliable - apn, address, subdivision, lot, county — parcel identification (null if absent) - pob_anchor, pob_corner, pob_edge, pob_from_end, pob_from_corner_ft, section, township, range_, tie_courses_json — anchor fields, matching map_easement_to_parcel's parameters - page_count, pages_read, legibility, notes If unsuccessful, returns a ToolError with details about the failure. |
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
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/ahamedfo/ibm-content-services-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server