README.md•17.6 kB
[](https://mseep.ai/app/yangkyeongmo-mcp-server-openmetadata)
# 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