Skip to main content
Glama
telota

bbaw-dse-mcp

by telota

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
EDITIONS_AB_URLNoURL for Praktiken der Monarchie eXist-dbhttps://actaborussica.bbaw.de
EDITIONS_SD_URLNoURL for Schleiermacher Digital eXist-dbhttp://localhost:8080
EDITIONS_CS_API_URLNoURL for correspSearch APIhttps://correspsearch.net/api/v2.0
EDITIONS_AB_PASSWORDNoPassword for Praktiken der Monarchie eXist-db
EDITIONS_AB_USERNAMENoUsername for Praktiken der Monarchie eXist-db
EDITIONS_SD_PASSWORDNoPassword for Schleiermacher Digital eXist-db
EDITIONS_SD_USERNAMENoUsername for Schleiermacher Digital eXist-dbadmin
EDITIONS_ANTHROPIC_API_KEYNoOptional Anthropic API key for research agent
EDITIONS_GEONAMES_USERNAMENoOptional GeoNames API username

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": true
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
sd_list_collectionsA

List available sub-collections in the database.

PURPOSE: Explore the database structure and find available collections.

WHEN TO USE:

  • User wants to know what data is available

  • Exploring the database structure

  • Finding the correct collection name for other queries

Args: parent: Parent collection path (relative to data_path). Empty = root.

Returns: Collection object with path, collections list, and document_count

sd_list_collection_contentsA

List files and subcollections in a collection.

PURPOSE: List files and subcollections without parsing document contents.

WHEN TO USE:

  • User wants to see what's available in a collection

  • Exploring collection structure

  • Fast overview of files and folders

WHEN NOT TO USE:

  • For document metadata → use get_file_info() afterward

  • For specific keyword search → use edition-specific search tools

  • For full document details → use get_document tools

Args: collection: Collection name/path (relative to data_path). Empty = root. limit: Maximum number of files to return ctx: FastMCP Context for progress reporting

Returns: Dict with 'collection_path', 'file_count', 'files', and 'subcollections'

sd_get_file_infoA

Get basic metadata for a single document file.

PURPOSE: Extract basic TEI metadata from a document without full parsing.

WHEN TO USE:

  • After browsing, to get details about specific files

  • When you need title, date, or ID information

  • For quick metadata extraction

WHEN NOT TO USE:

  • For full document content → use get_document tools

  • For multiple files at once → use browse then call this for each

Args: file_path: Full path to the file (relative to /db) or just filename ctx: FastMCP Context for progress reporting

Returns: Dict with 'id', 'title', 'date', 'path', 'mime_type', 'size_bytes', 'modified'

sd_get_collection_statsA

Get statistics about documents in a collection.

PURPOSE: Understand the size and content of a collection.

WHEN TO USE:

  • User asks "how many documents are there?"

  • Getting an overview before browsing/searching

  • Verifying data availability

Args: collection: Collection path (relative to data_path). Empty = root.

Returns: CollectionStats object with document counts and metadata

sd_execute_xqueryA

Execute a raw XQuery against the database.

PURPOSE: Run custom queries for advanced users or debugging.

WHEN TO USE:

  • Other tools don't provide the needed functionality

  • Debugging or exploring data structure

  • Complex custom queries

WHEN NOT TO USE:

  • For common operations, use specific tools instead

  • Don't use for write operations (read-only!)

Args: query: XQuery string to execute max_results: Maximum number of results to return

Returns: Raw query result as string (usually XML)

sd_check_database_connectionA

Check if the database is reachable and responsive.

PURPOSE: Verify database connectivity for troubleshooting.

WHEN TO USE:

  • When other tools fail unexpectedly

  • To verify setup is working

  • Health monitoring

Returns: DatabaseStatus object with connection status, version, and paths

sd_get_raw_document_by_idA

Retrieve raw XML document by its xml:id.

PURPOSE: Fetch raw XML for a document using its TEI xml:id attribute.

WHEN TO USE:

  • After finding a document via search or browse

  • When you need the raw XML for custom processing

  • As a low-level building block for edition-specific tools

WHEN NOT TO USE:

  • For exploring/discovering documents → use browse or search tools

  • When you only have a file path → use get_raw_document_by_path()

Args: document_id: The xml:id attribute of the TEI document collection: Optional collection filter (relative to data_path) ctx: FastMCP Context for progress reporting

Returns: RawDocument with id and xml content

sd_get_raw_document_by_pathA

Retrieve raw XML document by its file path.

PURPOSE: Fetch raw XML for a document using its database path.

WHEN TO USE:

  • When you have a file path from browse_collection

  • When accessing documents with known paths

  • Faster than ID-based lookup when path is known

WHEN NOT TO USE:

  • When you have an xml:id → use get_raw_document_by_id()

  • For exploring documents → use browse or search tools

Args: doc_path: Path to the document (relative to /db) ctx: FastMCP Context for progress reporting

Returns: RawDocument with id, xml content, and path

sd_get_document_by_idA

Retrieve complete document.

PURPOSE: Detailed view of a specific document as Markdown

WHEN TO USE:

  • User wants to read a letter/diary entry

  • After successful search → display details

  • For citations and text analysis

WHEN NOT TO USE:

  • For browsing/exploring → use list_collections() or list_collection_contents()

  • For keyword search → use search_by_keyword()

Args: document_id: The xml:id of the document ctx: FastMCP Context

Returns: Formatted markdown string with document content

sd_search_registerA

Search register using Lucene fulltext index.

PURPOSE: Find persons, places, works, or organizations using indexed search

WHEN TO USE:

  • User searches for person, place, work, or organization

  • For biographical/geographical/bibliographical information

  • To get IDs for further searches

WHEN NOT TO USE:

  • For fulltext search in letters/diaries → use search_by_keyword()

Args: query: Search term (name, title, etc.) register_type: Optional filter - 'person', 'place', 'work', 'org', or None for all max_results: Maximum results ctx: FastMCP Context

Returns: List of register entry dicts with id, title, desc, type

sd_get_register_entryA

Get detailed information about a register entry.

PURPOSE: Complete register entry details, optionally with mentions

WHEN TO USE:

  • After register search for details about a person/place/work

  • For biographical information

  • To find mentions in letters/diaries (set include_mentions=True)

WHEN NOT TO USE:

  • For document details → use get_document_by_id()

Args: entry_id: xml:id of the register entry (e.g., "S0003676") include_mentions: If True, fetch mentions across letters, diaries, lectures max_mentions: Max mentions per category when include_mentions=True (default 20) ctx: FastMCP Context

Returns: PersonEntry, PlaceEntry, WorkEntry, or dict based on entry type

sd_search_documentsA

Search documents in Schleiermacher Digital via eXist-db with facets.

PURPOSE: Primary search tool for finding documents by text, type, year, etc.

WHEN TO USE:

  • Full-text search in documents

  • Filter by document type (letter, diary, lecture, etc.)

  • Filter by year or date range

  • Any search query for document discovery

WHEN NOT TO USE:

  • For structured letter filtering by sender/receiver → use filter_letters()

  • For register search (persons, places) → use search_register()

  • For detailed text passages → use get_document_passages()

⚠️ CITATION WARNING: Only cite documents returned by this tool. Each result includes:

  • document_id: Use this EXACT value for citations

  • citation_url: Use this EXACT URL, do not construct your own NEVER invent document IDs or URLs that were not returned in the results.

Valid doc_types (from index):

  • "letter" or "letter fs" (8071 documents)

  • "lecture" or "lecture fs" (143 documents)

  • "chronology" (61 documents)

  • "intro" (42 documents)

  • "chronology-intro" (29 documents)

  • "diary" or "diary fs" (21 documents)

Args: query: Search terms (space-separated for multiple terms) doc_types: Filter by document types (letter, letter fs, diary, diary fs, lecture, lecture fs, chronology, intro) years: Filter by years (e.g., ["1810", "1811"]) date_from: Earliest date (ISO 8601, e.g., "1810-01-01") date_to: Latest date (ISO 8601, e.g., "1815-12-31") include_commentary: If True, search in commentary too (default: True) use_or_logic: If True, use OR between terms (default); if False, use AND limit: Maximum results (default: 50) ctx: FastMCP Context

Returns: List of SearchResult objects with document_id, title, type, date, kwic_snippets, and citation_url

sd_filter_lettersA

Filter letters by sender, receiver, place, and time period.

PURPOSE: Filter letters by specific criteria (FAST - uses cache)

WHEN TO USE:

  • User asks "letters from/to person X"

  • User asks "letters from Berlin"

  • User asks "letters between 1810 and 1815"

  • For correspondence network analyses

WHEN NOT TO USE:

  • For keyword search → use search_by_keyword()

  • For register search → use search_register()

Args: sender: Person ID of sender (from register, e.g., "S0003676") receiver: Person ID of receiver (from register, e.g., "S0003677") send_place: Place ID or name of sending location (e.g., "S0000065" or "Berlin") not_before: Earliest date (ISO 8601, e.g., "1810-01-01") not_after: Latest date (ISO 8601, e.g., "1815-12-31") max_results: Maximum results ctx: FastMCP Context

Returns: List of Letter objects

sd_get_correspondent_statsA

Statistics about correspondents (for network analysis).

PURPOSE: Overview of most important correspondents

WHEN TO USE:

  • User asks "Who was important for X?"

  • User asks "Most frequent correspondents"

  • For quantitative analyses

Args: year: Optional year filter min_letters: Minimum number of letters ctx: FastMCP Context

Returns: List of dicts with person_name, total, letters_sent, letters_received

sd_get_document_passagesA

Retrieve text passages from a specific document.

PURPOSE: Get actual text content from a document found via search

WHEN TO USE:

  • After search returns relevant document IDs

  • User wants to read specific sections

  • Need actual quotes for citations

WHEN NOT TO USE:

  • For discovery → use search_documents_direct()

  • For full document → use get_document_by_id()

Args: document_id: The xml:id of the document query: Optional search term to highlight/filter passages division: Filter to specific div by @n value page: Filter to specific page by pb/@n context_size: Characters of context around matches max_passages: Maximum passages to return ctx: FastMCP Context

Returns: List of Passage objects with text and location info

sd_get_diary_entryA

Retrieve a specific diary entry by date.

PURPOSE: Access a specific day's entry from Schleiermacher's diary

Available years: 1808-1811, 1817, 1820-1834. Note: 1812-1816 and 1818-1819 are not extant.

WHEN TO USE:

  • User asks for diary entry on specific date

  • User wants to know what happened on a particular day

  • After search → get full diary entry

WHEN NOT TO USE:

  • For date range → use get_diary_entries()

  • For keyword search → use search_in_documents()

Args: date: Date in ISO 8601 format (YYYY-MM-DD), e.g., "1808-01-01" ctx: FastMCP Context

Returns: Dictionary with date, content from left side, content from right side, and raw XML of the entry

sd_get_diary_entriesA

Retrieve diary entries for a date range.

PURPOSE: Access multiple diary entries across a time period

Available years: 1808-1811, 1817, 1820-1834. Note: 1812-1816 and 1818-1819 are not extant.

WHEN TO USE:

  • User asks for diary entries in a date range

  • User wants to see activities over a period

  • For temporal analysis of diary content

WHEN NOT TO USE:

  • For single date → use get_diary_entry()

  • For keyword search → use search_in_documents()

Args: date_from: Start date in ISO 8601 format (YYYY-MM-DD) date_to: End date in ISO 8601 format (YYYY-MM-DD) ctx: FastMCP Context

Returns: List of dictionaries, each with date, left_side, right_side content

sd_get_chronology_entryA

Retrieve chronology entries for a specific date.

PURPOSE: Access events from Schleiermacher's life on a specific date

WHEN TO USE:

  • User asks what happened on a specific date

  • User wants biographical information for a particular day

  • After search → get full chronology entry

WHEN NOT TO USE:

  • For date range → use get_chronology_entries()

  • For entire year → use get_chronology_year()

  • For keyword search → use search_documents()

Args: date: Date in ISO 8601 format (YYYY-MM-DD), e.g., "1785-08-29" ctx: FastMCP Context

Returns: List of dictionaries with date info and event descriptions. Multiple events may occur on the same date.

sd_get_chronology_entriesA

Retrieve chronology entries for a date range.

PURPOSE: Access events from Schleiermacher's life across a time period

WHEN TO USE:

  • User asks what happened during a specific period

  • User wants biographical timeline for a date range

  • For temporal analysis of Schleiermacher's life events

WHEN NOT TO USE:

  • For single date → use get_chronology_entry()

  • For entire year → use get_chronology_year()

  • For keyword search → use search_documents()

Args: date_from: Start date in ISO 8601 format (YYYY-MM-DD) date_to: End date in ISO 8601 format (YYYY-MM-DD) ctx: FastMCP Context

Returns: List of dictionaries with date info and event descriptions, sorted chronologically. Includes both specific dates and date ranges that overlap with the query range.

sd_get_chronology_yearA

Retrieve all chronology entries for a specific year.

PURPOSE: Access complete biographical timeline for a year in Schleiermacher's life

WHEN TO USE:

  • User asks "What happened in 1785?"

  • User wants overview of activities in a specific year

  • For annual biographical summaries

WHEN NOT TO USE:

  • For specific date → use get_chronology_entry()

  • For date range spanning multiple years → use get_chronology_entries()

  • For keyword search → use search_documents()

Args: year: Year (e.g., 1785) ctx: FastMCP Context

Returns: Dictionary with year, heading, and list of chronology entries. Entries are sorted chronologically within the year.

mop_browse_documentsA

Browse files and subcollections in MoP.

PURPOSE: Überblick über verfügbare Dateien in der MoP-Edition

WHEN TO USE:

  • User möchte sehen, was in der Edition verfügbar ist

  • Exploration ohne konkreten Suchbegriff

WHEN NOT TO USE:

  • Bei konkreter Suche → nutze search_documents()

  • Für Metadaten → nutze get_document() danach

Args: collection: Collection-Name (Texte, Register) limit: Maximale Anzahl Dateien ctx: FastMCP Context für Progress

Returns: Dict mit 'files' und 'subcollections' Liste

mop_search_documentsA

Volltextsuche in MoP-Dokumenten.

PURPOSE: Dokumente finden, die einen bestimmten Begriff enthalten

WHEN TO USE:

  • User sucht nach Person, Institution, Thema

  • Explorative Suche zu höfischen Praktiken

WHEN NOT TO USE:

  • Für strukturierte Registersuche → nutze search_register()

Args: keyword: Suchbegriff collection: Collection (Texte) max_results: Maximale Ergebnisse ctx: FastMCP Context

Returns: Liste von SearchResult-Objekten

mop_get_documentA

Vollständiges Dokument abrufen.

PURPOSE: Detaillierte Ansicht eines spezifischen Dokuments

WHEN TO USE:

  • User möchte ein Aktenstück lesen

  • Nach erfolgreicher Suche → Details anzeigen

WHEN NOT TO USE:

  • Für Übersicht → nutze browse_documents() oder search_documents()

Args: document_id: Die xml:id des Dokuments include_xml: Ob TEI-XML inkludiert werden soll ctx: FastMCP Context

Returns: Document-Objekt mit Metadaten und Content

mop_search_registerA

Suche in MoP-Registern.

PURPOSE: Strukturierte Registereinträge finden

WHEN TO USE:

  • User sucht nach Person, Ort, Institution, Hof

  • Um IDs für weitere Suchen zu bekommen

WHEN NOT TO USE:

  • Für Volltextsuche → nutze search_documents()

Args: query: Suchbegriff register_type: Register (personen, orte, institutionen, hoefe, werke, aemter) max_results: Maximale Ergebnisse ctx: FastMCP Context

Returns: Liste von Register-Einträgen mit id, name, type, gnd (optional)

mop_get_register_entryA

Detailansicht eines Registereintrags.

PURPOSE: Vollständige Informationen zu Person, Ort, etc.

WHEN TO USE:

  • Nach Registersuche für Details

  • Für biographische/geographische Informationen

Args: entry_id: ID des Registereintrags register_type: Register-Typ ctx: FastMCP Context

Returns: Dict mit allen verfügbaren Informationen

mop_search_biogrammeA

Suche in MoP-Biogrammen (detaillierte Biografien).

PURPOSE: Detaillierte biografische Einträge finden

WHEN TO USE:

  • User sucht nach Person für biografische Details

  • Um Familienverhältnisse, Karriere, Besitztümer zu recherchieren

  • Prosopographische Forschung zu Hofbeamten

WHEN NOT TO USE:

  • Für einfache Registersuche → nutze search_register("personen")

  • Für Volltextsuche in Dokumenten → nutze search_documents()

Args: query: Suchbegriff (Name) birth_year: Filter nach Geburtsjahr death_year: Filter nach Sterbejahr max_results: Maximale Ergebnisse ctx: FastMCP Context

Returns: Liste von Biogramm-Treffern mit id, name, birth, death, gnd

mop_get_biogramm_by_idA

Vollständiges Biogramm mit allen Details abrufen.

PURPOSE: Detaillierte biografische Daten einer Person abrufen

WHEN TO USE:

  • Nach search_biogramme() um Details zu bekommen

  • Um Familiennetzwerk, Karriere, Besitz zu analysieren

  • Für vollständige prosopographische Information

Args: biogramm_id: XML-ID des Biogramms (z.B. "P0005251") ctx: FastMCP Context

Returns: Dict mit allen biografischen Daten strukturiert

mop_extract_family_networkA

Familiennetzwerk aus einem Biogramm extrahieren.

PURPOSE: Verwandtschaftsbeziehungen analysieren

WHEN TO USE:

  • Für genealogische Forschung

  • Um höfische Netzwerke zu rekonstruieren

  • Analyse von Familiendynastien am Hof

Args: biogramm_id: XML-ID des Biogramms ctx: FastMCP Context

Returns: Dict mit Familienrelationen strukturiert nach Typ

mop_get_residential_topographyA

Fetch complete residential topography dataset for a specific year.

PURPOSE: Retrieve GeoJSON data with addresses and locations of court officials, royal family members, and other persons/institutions in Berlin and Prussia.

WHEN TO USE:

  • User asks about where people lived in a specific year

  • User wants to analyze residential patterns

  • User needs geographic distribution of court members

  • For mapping and spatial analysis

WHEN NOT TO USE:

  • For biographical register data → use search_register()

  • For document texts → use browse_documents() or search_documents()

Args: year: Year for which to retrieve data (1800, 1845, 1872, 1891, or 1914) ctx: FastMCP Context for progress reporting

Returns: Dict with: - year: The requested year - total_features: Total number of entries - features_with_coordinates: Number of entries with valid geographic coordinates - categories: Count of entries per category - cities: Count of entries per city - sample_features: First 10 features as examples - query_methods: Available search methods

Raises: ToolError: If year is not available or API request fails

mop_search_residential_topographyA

Search residential topography data with multiple filters.

PURPOSE: Find persons/institutions by various criteria in historical address data.

WHEN TO USE:

  • User searches for specific person by name

  • User wants to know who lived at a specific address

  • User wants to filter by profession, category, or location

  • User needs to find all court members in a certain category

WHEN NOT TO USE:

  • For biographical details → use get_register_entry()

  • For full dataset overview → use get_residential_topography()

Args: year: Year for data (1800, 1845, 1872, 1891, or 1914) name: Last name (partial match, case-insensitive) vorname: First name (partial match, case-insensitive) kategorie: Category filter (e.g., "Königliche Familie", "Diplomatie") taetigkeit: Occupation/activity filter stadt: City filter (partial match) strasse: Street name filter (partial match) ediarum_id: Exact Ediarum-ID match only_with_coordinates: Return only entries with valid geographic coordinates max_results: Maximum number of results to return ctx: FastMCP Context

Returns: Dict with: - year: The queried year - filters_applied: List of active filters - total_matches: Number of matching entries - returned_results: Number of results in response (limited by max_results) - results: List of matching features

Raises: ToolError: If year is not available or no filters provided

mop_list_available_wohntopo_yearsA

List all available years for residential topography data.

PURPOSE: Show which years have Wohntopographie datasets available.

WHEN TO USE:

  • User asks about available time periods

  • User wants to know which years can be queried

  • Before choosing a year for analysis

Returns: Dict with available years and description

mop_search_adjutanten_journalsA

Search in Adjutantenjournale (court adjutant journals).

PURPOSE: Find daily court journal entries documenting royal activities, audiences, meetings, and events. Each entry shows who was on duty and what happened.

WHEN TO USE:

  • User asks "What did the king do on [date]?"

  • User wants to know about daily court life

  • User searches for specific events, persons, or places mentioned in journals

  • User wants to track activities of a specific monarch

  • User researches who served as adjutant when

WHEN NOT TO USE:

  • For biographical data → use search_register()

  • For correspondence → use letters search in Schleiermacher Digital

  • For institutional documents → use browse_documents()

Args: query: Full-text search term (searches in journal text) monarch: Filter by monarch (Friedrich_Wilhelm_IV, Wilhelm_I, Wilhelm_II, Friedrich_III) date_from: Start date in ISO format (YYYY-MM-DD), e.g., "1861-01-01" date_to: End date in ISO format (YYYY-MM-DD), e.g., "1861-12-31" person_key: Filter by person mentioned (register key, e.g., "P0002157") place_key: Filter by place mentioned (register key, e.g., "P0003556") limit: Maximum number of results (default: 50) ctx: FastMCP Context for progress reporting

Returns: List of journal entries with: - id: Document ID - monarch: Which monarch's reign - date_from/date_to: Time range covered - place: Where the court was located - authors: Adjutants who wrote the entry - snippet: Text excerpt showing matched content - url: Link to full entry on website

Raises: ToolError: If monarch is invalid or query fails

mop_get_adjutanten_journal_entryA

Retrieve full text and metadata of a specific journal entry.

PURPOSE: Get complete details of a daily court journal entry.

WHEN TO USE:

  • After finding entries with search_adjutanten_journals()

  • User wants to read the full journal entry for a specific day

  • User needs detailed information about activities on a specific date

WHEN NOT TO USE:

  • For searching multiple entries → use search_adjutanten_journals()

  • For biographical data → use get_register_entry()

Args: document_id: Document ID from search results (e.g., "P0005285") ctx: FastMCP Context for progress reporting

Returns: Dict with: - id: Document ID - monarch: Which monarch's reign - date_from/date_to: Time range covered - shelfmark: Archive reference - days: List of daily entries, each with: - date: ISO date - place: Location - authors: Adjutants on duty - text: Full journal text for that day - url: Link to online edition

Raises: ToolError: If document not found or retrieval fails

mop_list_adjutanten_by_monarchA

List all adjutants who served under a specific monarch.

PURPOSE: Identify who served as adjutant and when.

WHEN TO USE:

  • User asks "Who served as adjutant under Wilhelm I?"

  • User wants to know the rotation of adjutants

  • User researches prosopography of court officials

WHEN NOT TO USE:

  • For full biographical data → use search_register()

  • For journal content → use search_adjutanten_journals()

Args: monarch: Monarch name (Friedrich_Wilhelm_IV, Wilhelm_I, Wilhelm_II, Friedrich_III) ctx: FastMCP Context for progress reporting

Returns: Dict with: - monarch: Monarch name - total_entries: Number of journal entries analyzed - adjutants: List of adjutants with: - name: Full name - person_key: Register ID - entries_count: How many times they wrote entries - date_range: First and last appearance

Raises: ToolError: If monarch is invalid or query fails

mop_check_database_connectionA

Check if the database is reachable and responsive.

PURPOSE: Verify database connectivity for troubleshooting.

WHEN TO USE:

  • When other tools fail unexpectedly

  • To verify setup is working

  • Health monitoring

Returns: DatabaseStatus object with connection status, version, and paths

mop_execute_xqueryA

Execute a raw XQuery against the database.

PURPOSE: Run custom queries for advanced users or debugging.

WHEN TO USE:

  • Other tools don't provide the needed functionality

  • Debugging or exploring data structure

  • Complex custom queries

WHEN NOT TO USE:

  • For common operations, use specific tools instead

  • Don't use for write operations (read-only!)

Args: query: XQuery string to execute max_results: Maximum number of results to return

Returns: Raw query result as string (usually XML)

cs_search_for_gnd_idA

Search for GND IDs by name using Lobid GND API.

PURPOSE: Find GND identifiers for persons, places, or corporate bodies.

WHEN TO USE:

  • When you need a GND ID for correspSearch filtering

  • To resolve person names to standard identifiers

  • For enriching metadata with authority data

WHEN NOT TO USE:

  • For full entity data → use get_gnd_entity() tools

  • For non-GND authority data → use other services

Args: name_query: Name or term to search for (e.g., "Goethe", "Humboldt") limit: Maximum number of results to return

Returns: List of dicts with 'id' (GND URI) and 'label' for matching entities

Example: >>> results = await search_for_gnd_id("Wilhelm von Humboldt") >>> gnd_id = results[0]['id'].split('/')[-1] # Extract ID from URI >>> letters = await search_correspondences(person_gnd=gnd_id)

cs_search_for_geonames_idA

Search for GeoNames IDs by place name.

PURPOSE: Find GeoNames identifiers for places to use as filters.

WHEN TO USE:

  • When you need a GeoNames ID for correspSearch place filtering

  • To resolve place names to standard identifiers

  • For geographic analysis of correspondence networks

WHEN NOT TO USE:

  • For person or organization names → use search_for_gnd_id()

  • When you already have a GeoNames ID

Args: place_query: Place name to search for (e.g., "Berlin", "Paris") country: Optional ISO-2 country code to restrict search (e.g., "DE", "FR") limit: Maximum number of results to return

Returns: List of dicts with place information: - geonameId: The GeoNames ID (use this for correspSearch) - name: Place name - countryCode: ISO-2 country code - lat, lng: Coordinates - adminName1: First-level admin division (e.g., state) - population: Population count (if available)

Example: >>> results = await search_for_geonames_id("Berlin", country="DE") >>> geonames_id = str(results[0]['geonameId']) >>> letters = await search_correspondences(place_geonames=geonames_id)

cs_get_place_geonames_idA

Get the GeoNames ID for a place (convenience function).

PURPOSE: Quick lookup of a single GeoNames ID for a place.

WHEN TO USE:

  • When you just need the ID without details

  • For quick place-to-ID conversion

  • When you're confident about the place name

WHEN NOT TO USE:

  • When the place name might be ambiguous → use search_for_geonames_id()

  • When you need full place details

Args: place_name: Name of the place (e.g., "Berlin", "Paris") country: Optional ISO-2 country code to restrict search (e.g., "DE")

Returns: GeoNames ID as integer, or None if not found

Example: >>> berlin_id = await get_place_geonames_id("Berlin", country="DE") >>> # Returns: 2950159 >>> letters = await search_correspondences(place_geonames=str(berlin_id))

cs_search_for_wikidata_occupationA

Search for occupation entities in Wikidata.

PURPOSE: Find Wikidata IDs for occupations to filter correspondence by profession.

WHEN TO USE:

  • When you need a Wikidata ID for correspSearch occupation filtering

  • To find letters by correspondent profession (writers, philosophers, etc.)

  • For professional network analysis

WHEN NOT TO USE:

  • For person names → use search_for_gnd_id()

  • For places → use search_for_geonames_id()

  • For non-occupation entities → use search_wikidata_entity()

Args: occupation_query: Occupation name to search for (e.g., "Dichter", "Philosoph", "Maler") limit: Maximum number of results to return

Returns: List of dicts with occupation entities: - id: Wikidata ID (e.g., "Q36180") - label: Occupation name in German - description: Brief description - uri: Full Wikidata URI

Example: >>> results = await search_for_wikidata_occupation("Schriftsteller") >>> occupation_id = results[0]['id'] # e.g., "Q36180" >>> letters = await search_correspondences(occupation_wikidata=occupation_id)

cs_search_wikidata_entityA

Search for any entity in Wikidata.

PURPOSE: General-purpose Wikidata entity search for various use cases.

WHEN TO USE:

  • When searching for entities that aren't occupations

  • For broader Wikidata lookups

  • When you need flexibility in entity type

WHEN NOT TO USE:

  • Specifically for occupations → use search_for_wikidata_occupation()

  • For GND/GeoNames data → use respective tools

Args: query: Search term for any Wikidata entity limit: Maximum number of results to return language: Language code for labels (default: "de")

Returns: List of dicts with entity information: - id: Wikidata ID (e.g., "Q36180") - label: Entity name - description: Brief description - uri: Full Wikidata URI

Example: >>> results = await search_wikidata_entity("Aufklärung") >>> entity_id = results[0]['id']

cs_search_correspondencesA

Cross-Edition Briefsuche über correspSearch API.

PURPOSE: Briefe über Edition-Grenzen hinweg finden

WHEN TO USE:

  • User möchte Briefe in ALLEN Editionen finden

  • Cross-Referenzierung zwischen Editionen

  • Für umfassende Korrespondenz-Netzwerk-Analyse

  • Suche nach Korrespondenz einer historischen Person

WHEN NOT TO USE:

  • Für schleiermacher-spezifische Suche → nutze sd_search_letters()

Args: person_gnd: GND-ID(s) - einzelne ID oder Liste (z.B. "118540238" oder ["118540238", "118607626"]) person_viaf: VIAF-ID(s) - einzelne ID oder Liste (alternativ zu GND) start_date: Start-Datum (ISO 8601, z.B. "1810-01-01") end_date: End-Datum (ISO 8601, z.B. "1815-12-31") place_geonames: GeoNames-ID eines Ortes (z.B. "2879139" für Leipzig) occupation_wikidata: Wikidata-ID eines Berufs (z.B. "Q36180" für Schriftsteller) edition_id: UUID einer Edition zur Filterung cmif_url: URL einer CMIF-Datei (z.B. "https://gams.uni-graz.at/context:hsa/CMIF") availability: "online", "print" oder "hybrid" text_query: Volltextsuche in Briefinhalten (experimentell, undokumentiert) gender: "male" (männlich), "female" (weiblich), oder "unknown" (unbekannt) role: "sent" (nur als Absender), "received" (nur als Empfänger), oder "mentioned" (nur erwähnt) place_role: "sent" (Schreibort) oder "received" (Empfangsort) page: Seite der Ergebnisse (1-indiziert, je 100 Treffer) max_results: Maximale Ergebnisse (zur Anzeige-Begrenzung) ctx: FastMCP Context

Returns: CorrespSearchResult mit Briefen und Paginierungs-Info

Note: Mehrere Personen (Liste) werden mit AND kombiniert - findet nur Briefe, die ALLE angegebenen Personen enthalten.

cs_get_edition_infoA

Informationen über eine Edition in correspSearch abrufen.

PURPOSE: Metadaten zu registrierten Editionen

WHEN TO USE:

  • User fragt nach verfügbaren Editionen

  • Für Edition-Discovery

  • Um die Quelle von gefundenen Briefen zu identifizieren

Args: edition_id: Edition-UUID in correspSearch ctx: FastMCP Context

Returns: EditionInfo mit Metadaten zur Edition

cs_search_correspondent_networkA

Korrespondenz-Netzwerk einer Person analysieren.

PURPOSE: Netzwerkanalyse von Korrespondenzen

WHEN TO USE:

  • User fragt "Mit wem korrespondierte Person X?"

  • Netzwerk-Visualisierung vorbereiten

  • Wichtigste Korrespondenzpartner identifizieren

Args: person_gnd: GND-ID der fokalen Person start_date: Optional: Start-Datum für Zeitfilter end_date: Optional: End-Datum für Zeitfilter max_correspondents: Maximale Anzahl Korrespondenten im Ergebnis max_letters_to_analyze: Maximale Anzahl Briefe zu analysieren (pro Richtung) ctx: FastMCP Context

Returns: Dict mit Netzwerk-Statistiken und Top-Korrespondenten

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription
sd_get_project_infoInformation about Schleiermacher Digital edition. Provides context about the project, data structure, and available content. Loads information from project_info.md file.
sd_get_citation_policyCritical citation guidelines to prevent hallucinated references. READ THIS FIRST before citing any documents from the Schleiermacher edition. Explains how to properly cite documents and avoid inventing document IDs.

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/telota/bbaw-dse-mcp'

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