Skip to main content
Glama
ahamedfo

IBM Content Services MCP Server

by ahamedfo

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
SCOPENoOAuth scope
PASSWORDNoAuthentication password
USERNAMENoAuthentication username
CLIENT_IDNoOAuth client ID
LOG_LEVELNoLogging level: DEBUG, INFO, WARNING, ERROR, CRITICAL (default INFO)
TOKEN_URLNoOAuth token URL
GRANT_TYPENoOAuth grant type
SERVER_URLNoContent Services GraphQL API endpoint URL
SSL_ENABLEDNoWhether SSL is enabled. Can be 'true', a path to a certificate file, or 'false'.
OBJECT_STORENoObject store identifier
POOL_MAXSIZENoMaximum pool size (default 100)
CLIENT_SECRETNoOAuth client secret
TOKEN_REFRESHNoToken refresh interval in seconds (default 1800)
ZENIAM_IAM_URLNoIAM url to get IAM token
ZENIAM_ZEN_URLNoZen url to exchange IAM token to Zen token
REQUEST_TIMEOUTNoRequest timeout in seconds (default 30.0)
ZENIAM_IAM_USERNoIAM user if grant type is password
POOL_CONNECTIONSNoNumber of connection pool connections (default 100)
RESOURCES_FOLDERNoFolder path in the repository containing documents to expose as MCP resources
ZENIAM_CLIENT_IDNoIAM client id if grant type is client_credentials
ZENIAM_IAM_SCOPENoIAM scope
TOKEN_SSL_ENABLEDNoWhether SSL is enabled for token endpoint. Can be 'true', a path, or 'false'.
ZENIAM_IAM_PASSWORDNoIAM password if grant type is password
ZENIAM_CLIENT_SECRETNoIAM client secret if grant type is client_credentials
ZENIAM_IAM_GRANT_TYPENoIAM grant type
ZENIAM_IAM_SSL_ENABLEDNoWhether SSL is enabled for IAM route
ZENIAM_ZEN_SSL_ENABLEDNoWhether SSL is enabled for Zen exchange route
RESOURCES_PREFIX_VALIDATIONNoControls prefix validation for resource documents: strict, warn, off (default warn)

Capabilities

Features and capabilities supported by this server

CapabilityDetails
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

NameDescription
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.

  1. determine_class tool to get the class_identifier.

  2. get_class_property_descriptions to get a list of valid properties for the given class_identifier

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:

  1. property_extraction - For content based property extraction workflows (provides class specific property names and document text content for AI-based extraction)

  2. get_class_property_descriptions - For general property updates (provides full property metadata including data types, cardinality, etc.)

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:

  1. list_all_classes - Call this tool only IF IT EXISTS and the user is using a (re)classification workflow where we need highest accuracy.

  2. determine_class - For general class update.

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.

  1. determine_class tool to get the class_name for search_class. The search class must be a document class or a document subclass.

  2. get_searchable_property_descriptions to get a list of valid property_name for search_properties

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.

  1. determine_class tool to get the class_identifier.

  2. get_class_property_descriptions to get a list of valid properties for the given class_identifier

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.

  1. determine_class tool to get the class_identifier.

  2. get_class_property_descriptions to get a list of valid properties for the given class_identifier

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 list_root_classes_tool tool.

: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.

  1. determine_class tool to get the class_name for search_class.

  2. get_searchable_property_descriptions to get a list of valid property_name for search_properties

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 lot as a third way to find the parcel. :param lot: Lot number within the subdivision (e.g. "104"). :param county: County whose GIS to query. Currently supported: maricopa. :param pob_anchor: How the Point of Beginning is located (required choice): - "parcel_edge": POB lies ON a parcel edge, pob_from_corner_ft from one end. Uses pob_edge / pob_from_end / pob_from_corner_ft. (e.g. "a point on the north line of the parcel, 122.93 feet west of the NE corner") - "parcel_corner": POB IS a named corner of the parcel/lot. Uses pob_corner. (e.g. "BEGINNING at the southwest corner of said Lot 104") - "section_corner": POB is reached by walking tie course(s) from a named corner of a PLSS section. Uses pob_corner, section, township, range_, tie_courses_json. (e.g. "COMMENCING at the SE corner of Section 32... THENCE N89-29-34W 65.00 FEET; THENCE ... TO THE POINT OF BEGINNING") :param pob_edge: (parcel_edge) Which parcel edge: north, south, east, west. :param pob_from_end: (parcel_edge) Which end of that edge the tie is measured from. :param pob_from_corner_ft: (parcel_edge) Distance in feet from that end to the POB. :param pob_corner: (parcel_corner / section_corner) Named corner: NW, NE, SW or SE. :param section: (section_corner) PLSS section number as printed, e.g. "31". :param township: (section_corner) Township, e.g. "1S" or "T1S". :param range_: (section_corner) Range, e.g. "7E" or "R7E". :param tie_courses_json: (section_corner) JSON array (same row format as line_table_json) of the course(s) walked from the section corner to the POB, in order. Use [] or omit if the POB is the section corner itself.

: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

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

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/ahamedfo/ibm-content-services-mcp-server'

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