Skip to main content
Glama

MCP Server for OpenMetadata

by yangkyeongmo
README.md17.6 kB
[![MseeP.ai Security Assessment Badge](https://mseep.net/pr/yangkyeongmo-mcp-server-openmetadata-badge.png)](https://mseep.ai/app/yangkyeongmo-mcp-server-openmetadata) # mcp-server-openmetadata [![smithery badge](https://smithery.ai/badge/@yangkyeongmo/mcp-server-openmetadata)](https://smithery.ai/server/@yangkyeongmo/mcp-server-openmetadata) A Model Context Protocol (MCP) server implementation for OpenMetadata, enabling seamless integration with MCP clients. This project provides a standardized way to interact with OpenMetadata through the Model Context Protocol. <a href="https://glama.ai/mcp/servers/lvgl5cmxa6"> <img width="380" height="200" src="https://glama.ai/mcp/servers/lvgl5cmxa6/badge" alt="Server for OpenMetadata MCP server" /> </a> ## About This project implements a [Model Context Protocol](https://modelcontextprotocol.io/introduction) server that wraps OpenMetadata's REST API, allowing MCP clients to interact with OpenMetadata in a standardized way. ## Feature Implementation Status ### Core Data Entities (`table`, `database`, `databaseschema`) | Feature | API Path | Status | |---------|----------|--------| | **Tables** | | | | List Tables | `/api/v1/tables` | ✅ | | Get Table | `/api/v1/tables/{id}` | ✅ | | Get Table by Name | `/api/v1/tables/name/{fqn}` | ✅ | | Create Table | `/api/v1/tables` | ✅ | | Update Table | `/api/v1/tables/{id}` | ✅ | | Delete Table | `/api/v1/tables/{id}` | ✅ | | **Databases** | | | | List Databases | `/api/v1/databases` | ✅ | | Get Database | `/api/v1/databases/{id}` | ✅ | | Get Database by Name | `/api/v1/databases/name/{fqn}` | ✅ | | Create Database | `/api/v1/databases` | ✅ | | Update Database | `/api/v1/databases/{id}` | ✅ | | Delete Database | `/api/v1/databases/{id}` | ✅ | | **Database Schemas** | | | | List Database Schemas | `/api/v1/databaseSchemas` | ✅ | | Get Database Schema | `/api/v1/databaseSchemas/{id}` | ✅ | | Get Database Schema by Name | `/api/v1/databaseSchemas/name/{fqn}` | ✅ | | Create Database Schema | `/api/v1/databaseSchemas` | ✅ | | Update Database Schema | `/api/v1/databaseSchemas/{id}` | ✅ | | Delete Database Schema | `/api/v1/databaseSchemas/{id}` | ✅ | ### Data Assets (`dashboard`, `chart`, `pipeline`, `topic`, `metric`, `container`, `report`, `mlmodel`) | Feature | API Path | Status | |---------|----------|--------| | **Dashboards** | | | | List Dashboards | `/api/v1/dashboards` | ✅ | | Get Dashboard | `/api/v1/dashboards/{id}` | ✅ | | Get Dashboard by Name | `/api/v1/dashboards/name/{fqn}` | ✅ | | Create Dashboard | `/api/v1/dashboards` | ✅ | | Update Dashboard | `/api/v1/dashboards/{id}` | ✅ | | Delete Dashboard | `/api/v1/dashboards/{id}` | ✅ | | **Charts** | | | | List Charts | `/api/v1/charts` | ✅ | | Get Chart | `/api/v1/charts/{id}` | ✅ | | Get Chart by Name | `/api/v1/charts/name/{fqn}` | ✅ | | Create Chart | `/api/v1/charts` | ✅ | | Update Chart | `/api/v1/charts/{id}` | ✅ | | Delete Chart | `/api/v1/charts/{id}` | ✅ | | **Pipelines** | | | | List Pipelines | `/api/v1/pipelines` | ✅ | | Get Pipeline | `/api/v1/pipelines/{id}` | ✅ | | Get Pipeline by Name | `/api/v1/pipelines/name/{fqn}` | ✅ | | Create Pipeline | `/api/v1/pipelines` | ✅ | | Update Pipeline | `/api/v1/pipelines/{id}` | ✅ | | Delete Pipeline | `/api/v1/pipelines/{id}` | ✅ | | **Topics** | | | | List Topics | `/api/v1/topics` | ✅ | | Get Topic | `/api/v1/topics/{id}` | ✅ | | Get Topic by Name | `/api/v1/topics/name/{fqn}` | ✅ | | Create Topic | `/api/v1/topics` | ✅ | | Update Topic | `/api/v1/topics/{id}` | ✅ | | Delete Topic | `/api/v1/topics/{id}` | ✅ | | **Metrics** | | | | List Metrics | `/api/v1/metrics` | ✅ | | Get Metric | `/api/v1/metrics/{id}` | ✅ | | Get Metric by Name | `/api/v1/metrics/name/{fqn}` | ✅ | | Create Metric | `/api/v1/metrics` | ✅ | | Update Metric | `/api/v1/metrics/{id}` | ✅ | | Delete Metric | `/api/v1/metrics/{id}` | ✅ | | **Containers** | | | | List Containers | `/api/v1/containers` | ✅ | | Get Container | `/api/v1/containers/{id}` | ✅ | | Get Container by Name | `/api/v1/containers/name/{fqn}` | ✅ | | Create Container | `/api/v1/containers` | ✅ | | Update Container | `/api/v1/containers/{id}` | ✅ | | Delete Container | `/api/v1/containers/{id}` | ✅ | | **Reports** | | | | List Reports | `/api/v1/reports` | ✅ | | Get Report | `/api/v1/reports/{id}` | ✅ | | Get Report by Name | `/api/v1/reports/name/{fqn}` | ✅ | | Create Report | `/api/v1/reports` | ✅ | | Update Report | `/api/v1/reports/{id}` | ✅ | | Delete Report | `/api/v1/reports/{id}` | ✅ | | **ML Models** | | | | List ML Models | `/api/v1/mlmodels` | ✅ | | Get ML Model | `/api/v1/mlmodels/{id}` | ✅ | | Get ML Model by Name | `/api/v1/mlmodels/name/{fqn}` | ✅ | | Create ML Model | `/api/v1/mlmodels` | ✅ | | Update ML Model | `/api/v1/mlmodels/{id}` | ✅ | | Delete ML Model | `/api/v1/mlmodels/{id}` | ✅ | ### Users & Teams (`user`, `team`) | Feature | API Path | Status | |---------|----------|--------| | **Teams** | | | | List Teams | `/api/v1/teams` | ✅ | | Get Team | `/api/v1/teams/{id}` | ✅ | | Get Team by Name | `/api/v1/teams/name/{name}` | ✅ | | Create Team | `/api/v1/teams` | ✅ | | Update Team | `/api/v1/teams/{id}` | ✅ | | Delete Team | `/api/v1/teams/{id}` | ✅ | | **Users** | | | | List Users | `/api/v1/users` | ✅ | | Get User | `/api/v1/users/{id}` | ✅ | | Get User by Name | `/api/v1/users/name/{name}` | ✅ | | Create User | `/api/v1/users` | ✅ | | Update User | `/api/v1/users/{id}` | ✅ | | Delete User | `/api/v1/users/{id}` | ✅ | ### Governance & Classification (`classification`, `glossary`, `tag`) | Feature | API Path | Status | |---------|----------|--------| | **Classifications** | | | | List Classifications | `/api/v1/classifications` | ✅ | | Get Classification | `/api/v1/classifications/{id}` | ✅ | | Get Classification by Name | `/api/v1/classifications/name/{name}` | ✅ | | Create Classification | `/api/v1/classifications` | ✅ | | Update Classification | `/api/v1/classifications/{id}` | ✅ | | Delete Classification | `/api/v1/classifications/{id}` | ✅ | | **Glossaries** | | | | List Glossaries | `/api/v1/glossaries` | ✅ | | Get Glossary | `/api/v1/glossaries/{id}` | ✅ | | Get Glossary by Name | `/api/v1/glossaries/name/{name}` | ✅ | | Create Glossary | `/api/v1/glossaries` | ✅ | | Update Glossary | `/api/v1/glossaries/{id}` | ✅ | | Delete Glossary | `/api/v1/glossaries/{id}` | ✅ | | List Glossary Terms | `/api/v1/glossaryTerms` | ✅ | | Get Glossary Term | `/api/v1/glossaryTerms/{id}` | ✅ | | **Tags** | | | | List Tags | `/api/v1/tags` | ✅ | | Get Tag | `/api/v1/tags/{id}` | ✅ | | Get Tag by Name | `/api/v1/tags/name/{name}` | ✅ | | Create Tag | `/api/v1/tags` | ✅ | | Update Tag | `/api/v1/tags/{id}` | ✅ | | Delete Tag | `/api/v1/tags/{id}` | ✅ | ### System & Operations (`bot`, `services`, `event`) | Feature | API Path | Status | |---------|----------|--------| | **Bots** | | | | List Bots | `/api/v1/bots` | ✅ | | Get Bot | `/api/v1/bots/{id}` | ✅ | | Get Bot by Name | `/api/v1/bots/name/{name}` | ✅ | | Create Bot | `/api/v1/bots` | ✅ | | Update Bot | `/api/v1/bots/{id}` | ✅ | | Delete Bot | `/api/v1/bots/{id}` | ✅ | | **Services** | | | | List Services | `/api/v1/services` | ✅ | | Database Services | `/api/v1/services/databaseServices` | ✅ | | Dashboard Services | `/api/v1/services/dashboardServices` | ✅ | | Messaging Services | `/api/v1/services/messagingServices` | ✅ | | Test Connection | `/api/v1/services/testConnection` | ✅ | | **Events** | | | | List Events | `/api/v1/events` | ✅ | | List Event Subscriptions | `/api/v1/events/subscriptions` | ✅ | | Get Event Subscription | `/api/v1/events/subscriptions/{id}` | ✅ | | Create Event Subscription | `/api/v1/events/subscriptions` | ✅ | | Update Event Subscription | `/api/v1/events/subscriptions/{id}` | ✅ | | Delete Event Subscription | `/api/v1/events/subscriptions/{id}` | ✅ | | Test Destination | `/api/v1/events/subscriptions/testDestination` | ✅ | ### Analytics & Monitoring (`lineage`, `usage`, `search`) | Feature | API Path | Status | |---------|----------|--------| | **Lineage** | | | | Get Lineage by Entity ID | `/api/v1/lineage/{entity}/{id}` | ✅ | | Get Lineage by Entity Name | `/api/v1/lineage/{entity}/name/{fqn}` | ✅ | | Add/Update Lineage | `/api/v1/lineage` | ✅ | | Delete Lineage | `/api/v1/lineage` | ✅ | | **Usage** | | | | Get Entity Usage | `/api/v1/usage/{entity}/{id}` | ✅ | | Add Usage Data | `/api/v1/usage` | ✅ | | Get Usage Summary | `/api/v1/usage/summary` | ✅ | | **Search & Discovery** | | | | Search Query | `/api/v1/search/query` | ✅ | | Search Suggest | `/api/v1/search/suggest` | ✅ | | Search Aggregate | `/api/v1/search/aggregate` | ✅ | | Search Field Query | `/api/v1/search/fieldQuery` | ✅ | ### Data Quality (`test_case`, `test_suite`) | Feature | API Path | Status | |---------|----------|--------| | **Test Cases** | | | | List Test Cases | `/api/v1/dataQuality/testCases` | ✅ | | Get Test Case | `/api/v1/dataQuality/testCases/{id}` | ✅ | | Get Test Case by Name | `/api/v1/dataQuality/testCases/name/{fqn}` | ✅ | | Create Test Case | `/api/v1/dataQuality/testCases` | ✅ | | Update Test Case | `/api/v1/dataQuality/testCases/{id}` | ✅ | | Delete Test Case | `/api/v1/dataQuality/testCases/{id}` | ✅ | | List Test Case Results | `/api/v1/dataQuality/testCases/{fqn}/testCaseResult` | ✅ | | Get Test Case Results | `/api/v1/dataQuality/testCases/testCaseResults/{fqn}` | ✅ | | **Test Suites** | | | | List Test Suites | `/api/v1/dataQuality/testSuites` | ✅ | | Get Test Suite | `/api/v1/dataQuality/testSuites/{id}` | ✅ | | Get Test Suite by Name | `/api/v1/dataQuality/testSuites/name/{name}` | ✅ | | Create Basic Test Suite | `/api/v1/dataQuality/testSuites/basic` | ✅ | | Create Executable Test Suite | `/api/v1/dataQuality/testSuites/executable` | ✅ | | Update Test Suite | `/api/v1/dataQuality/testSuites/{id}` | ✅ | | Delete Test Suite | `/api/v1/dataQuality/testSuites/{id}` | ✅ | | Get Execution Summary | `/api/v1/dataQuality/testSuites/executionSummary` | ✅ | | Get Data Quality Report | `/api/v1/dataQuality/testSuites/dataQualityReport` | ✅ | ### Access Control & Security (`policy`, `role`) | Feature | API Path | Status | |---------|----------|--------| | **Policies** | | | | List Policies | `/api/v1/policies` | ✅ | | Get Policy | `/api/v1/policies/{id}` | ✅ | | Get Policy by Name | `/api/v1/policies/name/{name}` | ✅ | | Create Policy | `/api/v1/policies` | ✅ | | Update Policy | `/api/v1/policies/{id}` | ✅ | | Delete Policy | `/api/v1/policies/{id}` | ✅ | | Validate Policy | `/api/v1/policies/validation/condition` | ✅ | | List Policy Resources | `/api/v1/policies/resources` | ✅ | | **Roles** | | | | List Roles | `/api/v1/roles` | ✅ | | Get Role | `/api/v1/roles/{id}` | ✅ | | Get Role by Name | `/api/v1/roles/name/{name}` | ✅ | | Create Role | `/api/v1/roles` | ✅ | | Update Role | `/api/v1/roles/{id}` | ✅ | | Delete Role | `/api/v1/roles/{id}` | ✅ | ### Domain Management (`domain`) | Feature | API Path | Status | |---------|----------|--------| | **Domains** | | | | List Domains | `/api/v1/domains` | ✅ | | Get Domain | `/api/v1/domains/{id}` | ✅ | | Get Domain by Name | `/api/v1/domains/name/{name}` | ✅ | | Create Domain | `/api/v1/domains` | ✅ | | Update Domain | `/api/v1/domains/{id}` | ✅ | | Delete Domain | `/api/v1/domains/{id}` | ✅ | | **Data Products** | | | | List Data Products | `/api/v1/dataProducts` | ✅ | | Get Data Product | `/api/v1/dataProducts/{id}` | ✅ | | Get Data Product by Name | `/api/v1/dataProducts/name/{fqn}` | ✅ | | Create Data Product | `/api/v1/dataProducts` | ✅ | | Update Data Product | `/api/v1/dataProducts/{id}` | ✅ | | Delete Data Product | `/api/v1/dataProducts/{id}` | ✅ | ### Not Yet Implemented | Feature | API Path | Status | |---------|----------|--------| | **API Management** | | | | API Collections | `/api/v1/apiCollections` | ❌ | | API Endpoints | `/api/v1/apiEndpoints` | ❌ | | **Other Assets** | | | | Apps | `/api/v1/apps` | ❌ | | **Feeds & Activity** | | | | Feeds | `/api/v1/feed` | ❌ | | **Advanced Features** | | | | Personas | `/api/v1/personas` | ❌ | | Queries | `/api/v1/queries` | ❌ | | Search Indexes | `/api/v1/searchIndexes` | ❌ | | Stored Procedures | `/api/v1/storedProcedures` | ❌ | | Suggestions | `/api/v1/suggestions` | ❌ | | Webhooks | `/api/v1/webhooks` | ❌ | ## API Groups The server supports modular API group selection via command line arguments. Available API groups: ### Core Data Entities - `table` - Table entity management - `database` - Database entity management - `databaseschema` - Database schema management ### Data Assets - `dashboard` - Dashboard entity management - `chart` - Chart entity management - `pipeline` - Pipeline entity management - `topic` - Topic entity management - `metrics` - Metric entity management - `container` - Container entity management - `report` - Report entity management - `mlmodel` - ML Model entity management ### Users & Teams - `user` - User entity management - `team` - Team entity management ### Governance & Classification - `classification` - Classification entity management - `glossary` - Glossary and glossary terms management - `tag` - Tag and tag category management ### System & Operations - `bot` - Bot entity management - `services` - Service configurations and connection testing - `event` - Event subscriptions and notifications ### Analytics & Monitoring - `lineage` - Data lineage management - `usage` - Usage analytics management - `search` - Search and discovery operations ### Data Quality - `test_case` - Data quality test case management - `test_suite` - Data quality test suite management ### Access Control & Security - `policy` - Access policies and security management - `role` - Role-based access control management ### Domain Management - `domain` - Domain and data product management You can specify which API groups to enable when running the server: ```bash # Enable only core entities python -m src.main --apis table,database,databaseschema # Enable comprehensive data quality and governance python -m src.main --apis test_case,test_suite,policy,role,tag,domain # Enable all available APIs python -m src.main --apis table,database,databaseschema,dashboard,chart,pipeline,topic,metrics,container,report,mlmodel,user,team,classification,glossary,tag,bot,services,event,lineage,usage,search,test_case,test_suite,policy,role,domain # Use default selection (all implemented APIs) python -m src.main ``` ## Setup ### Installing via Smithery To install OpenMetadata MCP Server for Claude Desktop automatically via [Smithery](https://smithery.ai/server/@yangkyeongmo/mcp-server-openmetadata): ```bash npx -y @smithery/cli install @yangkyeongmo/mcp-server-openmetadata --client claude ``` ### Environment Variables Set one of the following authentication methods: #### Token Authentication (Recommended) ``` OPENMETADATA_HOST=<your-openmetadata-host> OPENMETADATA_JWT_TOKEN=<your-jwt-token> ``` #### Basic Authentication ``` OPENMETADATA_HOST=<your-openmetadata-host> OPENMETADATA_USERNAME=<your-username> OPENMETADATA_PASSWORD=<your-password> ``` ### Usage with Claude Desktop Add to your `claude_desktop_config.json` using one of the following authentication methods: #### Token Authentication (Recommended) ```json { "mcpServers": { "mcp-server-openmetadata": { "command": "uvx", "args": ["mcp-server-openmetadata"], "env": { "OPENMETADATA_HOST": "https://your-openmetadata-host", "OPENMETADATA_JWT_TOKEN": "your-jwt-token" } } } } ``` #### Basic Authentication ```json { "mcpServers": { "mcp-server-openmetadata": { "command": "uvx", "args": ["mcp-server-openmetadata"], "env": { "OPENMETADATA_HOST": "https://your-openmetadata-host", "OPENMETADATA_USERNAME": "your-username", "OPENMETADATA_PASSWORD": "your-password" } } } } ``` Alternative configuration using `uv`: #### Token Authentication (Recommended) ```json { "mcpServers": { "mcp-server-openmetadata": { "command": "uv", "args": [ "--directory", "/path/to/mcp-server-openmetadata", "run", "mcp-server-openmetadata" ], "env": { "OPENMETADATA_HOST": "https://your-openmetadata-host", "OPENMETADATA_JWT_TOKEN": "your-jwt-token" } } } } ``` #### Basic Authentication ```json { "mcpServers": { "mcp-server-openmetadata": { "command": "uv", "args": [ "--directory", "/path/to/mcp-server-openmetadata", "run", "mcp-server-openmetadata" ], "env": { "OPENMETADATA_HOST": "https://your-openmetadata-host", "OPENMETADATA_USERNAME": "your-username", "OPENMETADATA_PASSWORD": "your-password" } } } } ``` Replace `/path/to/mcp-server-openmetadata` with the actual path where you've cloned the repository. ### Manual Execution You can also run the server manually: ```bash python src/server.py ``` Options: - `--port`: Port to listen on for SSE (default: 8000) - `--transport`: Transport type (stdio/sse, default: stdio) ## Contributing Contributions are welcome! Please feel free to submit a Pull Request. ## License MIT License

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/yangkyeongmo/mcp-server-openmetadata'

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