nexatron-mcp 1.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- nexatron_mcp-1.0.0/.gitignore +27 -0
- nexatron_mcp-1.0.0/CHANGELOG.md +59 -0
- nexatron_mcp-1.0.0/CONTRIBUTING.md +136 -0
- nexatron_mcp-1.0.0/LICENSE +21 -0
- nexatron_mcp-1.0.0/PKG-INFO +409 -0
- nexatron_mcp-1.0.0/README.md +355 -0
- nexatron_mcp-1.0.0/SECURITY.md +67 -0
- nexatron_mcp-1.0.0/examples/README.md +97 -0
- nexatron_mcp-1.0.0/pyproject.toml +185 -0
- nexatron_mcp-1.0.0/src/nexatron_mcp/__init__.py +35 -0
- nexatron_mcp-1.0.0/src/nexatron_mcp/client.py +162 -0
- nexatron_mcp-1.0.0/src/nexatron_mcp/py.typed +0 -0
- nexatron_mcp-1.0.0/src/nexatron_mcp/server.py +467 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Build artifacts
|
|
2
|
+
dist/
|
|
3
|
+
build/
|
|
4
|
+
*.egg-info/
|
|
5
|
+
*.egg
|
|
6
|
+
|
|
7
|
+
# Test / coverage artifacts
|
|
8
|
+
.pytest_cache/
|
|
9
|
+
.mypy_cache/
|
|
10
|
+
.ruff_cache/
|
|
11
|
+
coverage.xml
|
|
12
|
+
.coverage
|
|
13
|
+
htmlcov/
|
|
14
|
+
|
|
15
|
+
# Virtual environments (local development)
|
|
16
|
+
.venv/
|
|
17
|
+
.test-venv/
|
|
18
|
+
venv/
|
|
19
|
+
|
|
20
|
+
# Python bytecode
|
|
21
|
+
__pycache__/
|
|
22
|
+
*.py[cod]
|
|
23
|
+
*$py.class
|
|
24
|
+
|
|
25
|
+
# OS
|
|
26
|
+
.DS_Store
|
|
27
|
+
Thumbs.db
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to `nexatron-mcp` are documented here.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
6
|
+
|
|
7
|
+
## [Unreleased]
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
- `pyproject.toml` version was incorrectly set to `2.0.0` with a description advertising an aspirational `ask` / `query_metric` / `compare_metric_across_sources` / `explain_metric` tool surface that was never shipped. Reset to `1.0.0` to match the actual 12-tool surface documented in this changelog and in `README.md`. No code or behavior change for installed users.
|
|
11
|
+
|
|
12
|
+
## [1.0.0] — 2026-04-17
|
|
13
|
+
|
|
14
|
+
**Production release** — the `nexatron-mcp` package is now a production-grade, enterprise-supported MCP server from **dotSolved Systems**, backed by SOC 2 Type 1 and ISO 27001 corporate compliance (Type 2 in progress).
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
- **12 MCP tools** exposed to Claude Desktop, Claude Code, Cursor, VS Code, Windsurf, and any other MCP-compatible AI client:
|
|
18
|
+
- `query` — ask questions about enterprise data in plain English; returns answer, generated SQL, result preview, and confidence score.
|
|
19
|
+
- `list_connections` — list all configured data source connections (Postgres, MySQL, SQL Server, BigQuery, Snowflake, Redshift, Databricks, Salesforce, S3).
|
|
20
|
+
- `get_schema` — fetch the schema for a specific connection (tables, columns, types).
|
|
21
|
+
- `test_connection` — verify connectivity and credentials.
|
|
22
|
+
- `detect_schema_drift` — report schema changes (added / removed / type-changed columns).
|
|
23
|
+
- `list_metrics` — list all metrics in the Nexatron semantic layer with certification status.
|
|
24
|
+
- `list_views` — list logical views defined in the semantic layer.
|
|
25
|
+
- `search_knowledge_base` — semantic search over ingested PDFs, docs, and unstructured sources (RAG).
|
|
26
|
+
- `list_conversations` — list recent query conversations for the authenticated user.
|
|
27
|
+
- `get_report` — retrieve a saved report by ID.
|
|
28
|
+
- `get_credit_balance` — check remaining query credits for the tenant.
|
|
29
|
+
- `whoami` — return the authenticated user and tenant context.
|
|
30
|
+
- **1 MCP resource**: `nexatron://platform/info` — live platform overview and capabilities manifest.
|
|
31
|
+
- **Two transport modes**:
|
|
32
|
+
- `stdio` (default) — for local AI clients (Claude Desktop, Cursor, VS Code, Windsurf).
|
|
33
|
+
- `sse` — Server-Sent Events for remote / cloud AI clients (including claude.ai custom integrations when used with the Nexatron backend's remote MCP endpoint).
|
|
34
|
+
- **Authentication**: Nexatron API keys (`nxa_*` prefix), stored SHA-256 hashed on the backend. Per-key scopes, expiration, IP allowlist, and revocation via `POST /api/v1/admin/api-keys`.
|
|
35
|
+
- **Tenant isolation**: every tool call is enforced through Nexatron's frozen `TenantContext` + four-layer row-level security, so an API key never sees another tenant's data.
|
|
36
|
+
- **BYO-LLM**: inherits the Nexatron tenant's Smart LLM Router configuration — queries route through the customer's Azure OpenAI, Bedrock, Anthropic, or Ollama contract with no vendor lock-in at the MCP layer.
|
|
37
|
+
- **Cryptographic audit trail**: every tool call is recorded in the Nexatron per-tenant audit log with HKDF-SHA256 export signing.
|
|
38
|
+
|
|
39
|
+
### Quality
|
|
40
|
+
- Full PEP 561 typing support (`py.typed` marker distributed in the wheel).
|
|
41
|
+
- Strict `mypy` type-check clean.
|
|
42
|
+
- `ruff` lint clean with security rules enabled (flake8-bandit).
|
|
43
|
+
- `pytest` suite with ≥70% coverage gate.
|
|
44
|
+
- GitHub Actions CI: test on every PR, auto-publish to PyPI on signed tag.
|
|
45
|
+
|
|
46
|
+
### Security
|
|
47
|
+
- See [SECURITY.md](SECURITY.md) for the responsible disclosure policy.
|
|
48
|
+
- No secrets ever logged; API key only transits the `Authorization: Bearer` header.
|
|
49
|
+
- Explicit `httpx` timeout defaults; no unbounded network calls.
|
|
50
|
+
|
|
51
|
+
### Compatibility
|
|
52
|
+
- Requires Python ≥ 3.10.
|
|
53
|
+
- Tested on Python 3.10, 3.11, 3.12, 3.13 in CI.
|
|
54
|
+
- Tested against Nexatron API ≥ v1.0.0.
|
|
55
|
+
- Compatible with every MCP client implementing the 2024-11 protocol spec (at minimum: Claude Desktop, Claude Code, Cursor, VS Code MCP, Windsurf).
|
|
56
|
+
|
|
57
|
+
## [0.1.0] — 2026-02 (internal beta)
|
|
58
|
+
|
|
59
|
+
Initial beta release to dotSolved design-partner customers. Not published to PyPI.
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# Contributing to nexatron-mcp
|
|
2
|
+
|
|
3
|
+
Thanks for your interest in contributing to the Nexatron MCP server. This package is maintained by **dotSolved Systems** as part of the Nexatron platform; contributions from the community are welcome and reviewed by the Nexatron engineering team.
|
|
4
|
+
|
|
5
|
+
## Ground rules
|
|
6
|
+
|
|
7
|
+
1. **Open an issue first** for anything larger than a one-line fix. This lets us discuss design before you invest time.
|
|
8
|
+
2. **Every change must be tested.** Pull requests without tests will be asked to add them.
|
|
9
|
+
3. **Every change must pass CI.** `ruff`, `mypy --strict`, and `pytest` all must be green. The CI gate is automatic on every PR.
|
|
10
|
+
4. **Do not break the public API.** The tools exposed to MCP clients (`query`, `list_connections`, etc.) are part of the public contract; changing their name, parameters, or response shape is a breaking change and requires a major version bump.
|
|
11
|
+
5. **Security-sensitive changes** (authentication, request signing, secrets handling) require a two-person review — one Nexatron engineer and one dotSolved security reviewer.
|
|
12
|
+
|
|
13
|
+
## Development setup
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
# From the repo root
|
|
17
|
+
cd packages/mcp-server
|
|
18
|
+
|
|
19
|
+
# Create and activate a virtual environment
|
|
20
|
+
python -m venv .venv
|
|
21
|
+
source .venv/bin/activate # on Windows: .venv\Scripts\activate
|
|
22
|
+
|
|
23
|
+
# Install the package in editable mode with dev extras
|
|
24
|
+
pip install -e ".[dev]"
|
|
25
|
+
|
|
26
|
+
# Verify the install
|
|
27
|
+
nexatron-mcp --help
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Running the tests
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
# Fast unit tests
|
|
34
|
+
pytest
|
|
35
|
+
|
|
36
|
+
# Verbose with coverage summary
|
|
37
|
+
pytest -v
|
|
38
|
+
|
|
39
|
+
# With coverage HTML report
|
|
40
|
+
pytest --cov-report=html && open htmlcov/index.html
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
The coverage gate is **70%**. Drops below that fail CI.
|
|
44
|
+
|
|
45
|
+
## Linting and type checking
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
# Lint (auto-fix where possible)
|
|
49
|
+
ruff check --fix .
|
|
50
|
+
|
|
51
|
+
# Format
|
|
52
|
+
ruff format .
|
|
53
|
+
|
|
54
|
+
# Type check (strict)
|
|
55
|
+
mypy src/nexatron_mcp
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Pull request checklist
|
|
59
|
+
|
|
60
|
+
Before opening a PR, please ensure:
|
|
61
|
+
|
|
62
|
+
- [ ] Tests pass locally (`pytest`).
|
|
63
|
+
- [ ] Lint passes (`ruff check .`).
|
|
64
|
+
- [ ] Type check passes (`mypy src/nexatron_mcp`).
|
|
65
|
+
- [ ] You added or updated tests for the behavior you changed.
|
|
66
|
+
- [ ] You updated [CHANGELOG.md](CHANGELOG.md) with your change under `[Unreleased]`.
|
|
67
|
+
- [ ] You updated [README.md](README.md) if the public API or install instructions changed.
|
|
68
|
+
- [ ] For tool additions: the new tool has a clear docstring, parameter types, and at least one example in the PR description.
|
|
69
|
+
|
|
70
|
+
## Commit messages
|
|
71
|
+
|
|
72
|
+
We use [Conventional Commits](https://www.conventionalcommits.org/):
|
|
73
|
+
|
|
74
|
+
- `feat(tools): add list_tenants tool`
|
|
75
|
+
- `fix(client): handle httpx timeout gracefully`
|
|
76
|
+
- `docs(readme): clarify sse setup for claude.ai`
|
|
77
|
+
- `test(server): cover credit_balance edge cases`
|
|
78
|
+
- `chore(ci): upgrade actions/checkout to v5`
|
|
79
|
+
|
|
80
|
+
## Release process
|
|
81
|
+
|
|
82
|
+
Releases are cut by Nexatron engineering maintainers. The sequence:
|
|
83
|
+
|
|
84
|
+
1. Update `version` in [pyproject.toml](pyproject.toml), `__version__` in `src/nexatron_mcp/__init__.py`, **and both `version` fields in [server.json](server.json)** (top-level + `packages[0].version`). The publish workflow refuses to ship unless all three agree with the tag.
|
|
85
|
+
2. Move entries from `[Unreleased]` to a new dated section in [CHANGELOG.md](CHANGELOG.md).
|
|
86
|
+
3. Open a PR titled `release: mcp-server-v<new-version>`; merge when approved and green.
|
|
87
|
+
4. Tag the merge commit: `git tag mcp-server-vX.Y.Z && git push --tags`. The package-scoped prefix avoids overlap with Nexatron platform release tags.
|
|
88
|
+
5. The [`mcp-publish`](../../.github/workflows/mcp-publish.yml) workflow picks up the tag, builds the wheel + sdist, publishes to PyPI via OIDC trusted publishing (no long-lived token), then publishes [`server.json`](server.json) to the MCP Registry at [`registry.modelcontextprotocol.io`](https://registry.modelcontextprotocol.io) using `mcp-publisher login github-oidc`.
|
|
89
|
+
|
|
90
|
+
### First-publish runbook (one-time setup)
|
|
91
|
+
|
|
92
|
+
The OIDC paths above need two one-time configurations before the first tag works end-to-end:
|
|
93
|
+
|
|
94
|
+
**1. PyPI trusted publisher.** A PyPI account with maintainer permission on the `nexatron-mcp` project (or an admin who can create it) registers this repo as a trusted publisher at <https://pypi.org/manage/account/publishing/>:
|
|
95
|
+
|
|
96
|
+
- Owner: `sravanmodugula-solved`
|
|
97
|
+
- Repository: `nexatron`
|
|
98
|
+
- Workflow filename: `mcp-publish.yml`
|
|
99
|
+
- Environment: leave blank (the workflow does not use a deployment environment)
|
|
100
|
+
|
|
101
|
+
No client secret is exchanged; PyPI verifies the OIDC `id-token` matches the configured repo + workflow at publish time. If the `nexatron-mcp` project does not yet exist on PyPI, the first publish creates it under the account that authorized the trusted publisher.
|
|
102
|
+
|
|
103
|
+
**2. MCP Registry namespace ownership.** The namespace `io.github.sravanmodugula-solved/...` is verified by GitHub OIDC at publish time — there is no separate registration step. The verification logic checks that the OIDC `repository_owner` claim equals `sravanmodugula-solved`, so any tag pushed from a fork (different owner) will be rejected. To migrate to a custom domain namespace like `ai.dotsolved.nexatron/mcp`, set up a DNS TXT record per the [MCP Registry DNS auth docs](https://github.com/modelcontextprotocol/registry/blob/main/docs/modelcontextprotocol-io/authentication.mdx) and change the `login` step in `mcp-publish.yml` to `dns` auth.
|
|
104
|
+
|
|
105
|
+
### Verifying a release end to end
|
|
106
|
+
|
|
107
|
+
After the workflow finishes, confirm the release on both sides:
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
# PyPI
|
|
111
|
+
pip index versions nexatron-mcp # should show the new version
|
|
112
|
+
uvx nexatron-mcp@<version> --help # smoke-test the published artifact
|
|
113
|
+
|
|
114
|
+
# MCP Registry
|
|
115
|
+
curl -s "https://registry.modelcontextprotocol.io/v0/servers?search=nexatron" | jq .
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
The Cursor + Claude Desktop discovery surfaces consume the registry, so a successful registry publish is the discovery-flow handoff — there is no separate Cursor or Anthropic Console submission.
|
|
119
|
+
|
|
120
|
+
### Dry run
|
|
121
|
+
|
|
122
|
+
To validate the workflow without publishing:
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
gh workflow run mcp-publish.yml -f dry_run=true
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
The dry run still builds the sdist + wheel and installs `mcp-publisher`, so it catches packaging errors and the `mcp-publisher --help` smoke-test, without uploading anything.
|
|
129
|
+
|
|
130
|
+
## Reporting security issues
|
|
131
|
+
|
|
132
|
+
**Do not open a public issue for a security vulnerability.** See [SECURITY.md](SECURITY.md) for the coordinated disclosure process.
|
|
133
|
+
|
|
134
|
+
## Licensing
|
|
135
|
+
|
|
136
|
+
By contributing, you agree that your contributions will be licensed under the [MIT License](LICENSE) used by this project. dotSolved Systems retains copyright on all contributions.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 dotSolved Systems, Inc.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: nexatron-mcp
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Nexatron MCP server — governed enterprise-data access for Claude Desktop, Claude Code, Cursor, VS Code, Windsurf, and any MCP-compatible AI client. Exposes 12 tools (query, list_connections, get_schema, list_metrics, list_views, search_knowledge_base, detect_schema_drift, test_connection, list_conversations, get_report, get_credit_balance, whoami) and 1 resource (nexatron://platform/info) over the Nexatron REST API with per-tenant isolation and cryptographic audit.
|
|
5
|
+
Project-URL: Homepage, https://nexatron.io
|
|
6
|
+
Project-URL: Documentation, https://docs.nexatron.io
|
|
7
|
+
Project-URL: Repository, https://github.com/sravanmodugula-solved/nexatron
|
|
8
|
+
Project-URL: Issues, https://github.com/sravanmodugula-solved/nexatron/issues
|
|
9
|
+
Project-URL: Changelog, https://github.com/sravanmodugula-solved/nexatron/blob/main/packages/mcp-server/CHANGELOG.md
|
|
10
|
+
Project-URL: Parent Company, https://dotsolved.com
|
|
11
|
+
Author-email: "dotSolved Systems, Inc." <info@dotsolved.com>
|
|
12
|
+
Maintainer-email: Nexatron Engineering <nexatron@dotsolved.com>
|
|
13
|
+
License: MIT
|
|
14
|
+
License-File: LICENSE
|
|
15
|
+
Keywords: ai,analytics,bi,business-intelligence,claude,claude-code,claude-desktop,cursor,data,dotsolved,enterprise,mcp,model-context-protocol,natural-language,nexatron,nl-to-sql,semantic-layer,text-to-sql,voice
|
|
16
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
17
|
+
Classifier: Environment :: Console
|
|
18
|
+
Classifier: Environment :: Plugins
|
|
19
|
+
Classifier: Framework :: AsyncIO
|
|
20
|
+
Classifier: Intended Audience :: Developers
|
|
21
|
+
Classifier: Intended Audience :: Information Technology
|
|
22
|
+
Classifier: Intended Audience :: System Administrators
|
|
23
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
24
|
+
Classifier: Natural Language :: English
|
|
25
|
+
Classifier: Operating System :: OS Independent
|
|
26
|
+
Classifier: Programming Language :: Python
|
|
27
|
+
Classifier: Programming Language :: Python :: 3
|
|
28
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
29
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
30
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
31
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
32
|
+
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
33
|
+
Classifier: Topic :: Database
|
|
34
|
+
Classifier: Topic :: Office/Business
|
|
35
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
36
|
+
Classifier: Topic :: Scientific/Engineering :: Information Analysis
|
|
37
|
+
Classifier: Topic :: Software Development :: Libraries
|
|
38
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
39
|
+
Classifier: Typing :: Typed
|
|
40
|
+
Requires-Python: >=3.10
|
|
41
|
+
Requires-Dist: httpx<1,>=0.27.0
|
|
42
|
+
Requires-Dist: mcp<2,>=1.0.0
|
|
43
|
+
Provides-Extra: dev
|
|
44
|
+
Requires-Dist: build>=1.2.0; extra == 'dev'
|
|
45
|
+
Requires-Dist: mypy>=1.11.0; extra == 'dev'
|
|
46
|
+
Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
|
|
47
|
+
Requires-Dist: pytest-cov>=5.0.0; extra == 'dev'
|
|
48
|
+
Requires-Dist: pytest-httpx>=0.30.0; extra == 'dev'
|
|
49
|
+
Requires-Dist: pytest>=8.0.0; extra == 'dev'
|
|
50
|
+
Requires-Dist: ruff>=0.6.0; extra == 'dev'
|
|
51
|
+
Requires-Dist: tomli>=2.0.0; (python_version < '3.11') and extra == 'dev'
|
|
52
|
+
Requires-Dist: twine>=5.1.0; extra == 'dev'
|
|
53
|
+
Description-Content-Type: text/markdown
|
|
54
|
+
|
|
55
|
+
# nexatron-mcp
|
|
56
|
+
|
|
57
|
+
<!-- mcp-name: io.github.sravanmodugula-solved/nexatron-mcp -->
|
|
58
|
+
|
|
59
|
+
MCP server for the [Nexatron](https://nexatron.io) AI Data Intelligence Platform. Ask questions about your enterprise data directly from Claude.
|
|
60
|
+
|
|
61
|
+
## Two ways to connect
|
|
62
|
+
|
|
63
|
+
- **Hosted endpoint (recommended)** — `https://api.nexatron.io/api/v1/mcp` over OAuth 2.1. Nothing to install; exposes the full **governed v2 surface** (ten data-access tools incl. `ask`, `query_metric`, `compare_metric_across_sources`, plus the governance-contract tools and per-call lineage). MCP-aware clients (claude.ai, Claude Desktop, Cursor) discover it from the [registry](https://registry.modelcontextprotocol.io) entry. See [docs.nexatron.io/integrations/mcp-reference](https://docs.nexatron.io/integrations/mcp-reference).
|
|
64
|
+
- **Local stdio package (this package)** — `uvx nexatron-mcp`, authenticated with an `nxa_` API key. A **REST-backed subset** for self-hosted Nexatron instances and offline-style local use; exposes the tools listed under [Available tools](#available-tools-local-stdio-package) below. The two surfaces are versioned independently.
|
|
65
|
+
|
|
66
|
+
## Install
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
pip install nexatron-mcp
|
|
70
|
+
# or
|
|
71
|
+
uvx nexatron-mcp
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Setup
|
|
75
|
+
|
|
76
|
+
### Claude Desktop
|
|
77
|
+
|
|
78
|
+
Add to `~/.claude/claude_desktop_config.json`:
|
|
79
|
+
|
|
80
|
+
```json
|
|
81
|
+
{
|
|
82
|
+
"mcpServers": {
|
|
83
|
+
"nexatron": {
|
|
84
|
+
"command": "uvx",
|
|
85
|
+
"args": ["nexatron-mcp"],
|
|
86
|
+
"env": {
|
|
87
|
+
"NEXATRON_API_KEY": "nxa_your_api_key",
|
|
88
|
+
"NEXATRON_URL": "https://api.nexatron.io/api/v1"
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Restart Claude Desktop. You'll see Nexatron tools available.
|
|
96
|
+
|
|
97
|
+
### Claude Code
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
claude mcp add nexatron -- uvx nexatron-mcp \
|
|
101
|
+
--env NEXATRON_API_KEY=nxa_your_key \
|
|
102
|
+
--env NEXATRON_URL=https://api.nexatron.io/api/v1
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### Cursor / VS Code
|
|
106
|
+
|
|
107
|
+
Add to `.cursor/mcp.json` or VS Code MCP settings:
|
|
108
|
+
|
|
109
|
+
```json
|
|
110
|
+
{
|
|
111
|
+
"mcpServers": {
|
|
112
|
+
"nexatron": {
|
|
113
|
+
"command": "uvx",
|
|
114
|
+
"args": ["nexatron-mcp"],
|
|
115
|
+
"env": {
|
|
116
|
+
"NEXATRON_API_KEY": "nxa_your_key",
|
|
117
|
+
"NEXATRON_URL": "https://api.nexatron.io/api/v1"
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## Environment Variables
|
|
125
|
+
|
|
126
|
+
| Variable | Required | Default | Description |
|
|
127
|
+
|----------|----------|---------|-------------|
|
|
128
|
+
| `NEXATRON_API_KEY` | Yes | — | Your Nexatron API key (starts with `nxa_`) |
|
|
129
|
+
| `NEXATRON_URL` | No | `http://localhost:8000/api/v1` | Nexatron API URL |
|
|
130
|
+
|
|
131
|
+
## Available tools (local stdio package)
|
|
132
|
+
|
|
133
|
+
These are the tools the installable `nexatron-mcp` stdio package exposes against the Nexatron REST API. The hosted endpoint exposes the broader governed v2 surface described in [Two ways to connect](#two-ways-to-connect).
|
|
134
|
+
|
|
135
|
+
| Tool | Description |
|
|
136
|
+
|------|-------------|
|
|
137
|
+
| `query` | Ask questions about your data in plain English |
|
|
138
|
+
| `list_connections` | See all data source connections |
|
|
139
|
+
| `list_metrics` | View certified metrics in the semantic layer |
|
|
140
|
+
| `list_views` | View logical views |
|
|
141
|
+
| `get_schema` | Explore database schemas |
|
|
142
|
+
| `test_connection` | Test data source connectivity |
|
|
143
|
+
| `detect_schema_drift` | Find schema changes |
|
|
144
|
+
| `search_knowledge_base` | Search uploaded documents (RAG) |
|
|
145
|
+
| `list_conversations` | View recent query history |
|
|
146
|
+
| `get_report` | Retrieve a saved report |
|
|
147
|
+
| `get_credit_balance` | Check remaining query credits |
|
|
148
|
+
| `whoami` | Show your user info and organization |
|
|
149
|
+
|
|
150
|
+
## Example
|
|
151
|
+
|
|
152
|
+
After setup, ask Claude:
|
|
153
|
+
|
|
154
|
+
> "Use Nexatron to show me total revenue by product category for Q4"
|
|
155
|
+
|
|
156
|
+
Claude will call the `query` tool, which sends your question through Nexatron's AI pipeline and returns the answer with SQL and results.
|
|
157
|
+
|
|
158
|
+
## SSE Transport (Remote)
|
|
159
|
+
|
|
160
|
+
For remote or web-based MCP clients:
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
NEXATRON_API_KEY=nxa_... nexatron-mcp --sse --port 8001
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
## Development
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
git clone https://github.com/sravanmodugula-solved/nexatron
|
|
170
|
+
cd nexatron/packages/mcp-server
|
|
171
|
+
pip install -e .
|
|
172
|
+
nexatron-mcp
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## License
|
|
176
|
+
|
|
177
|
+
MIT
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
# Release & registry submission runbook
|
|
182
|
+
|
|
183
|
+
> Merged from the former `docs/integrations/mcp-server.md` (2026-06 necessity
|
|
184
|
+
> audit) — this README is the natural home for "how to release this package."
|
|
185
|
+
> Status tables below reflect pre-submission state; update as registries are
|
|
186
|
+
> submitted.
|
|
187
|
+
|
|
188
|
+
## 1. PyPI — publish `nexatron-mcp`
|
|
189
|
+
|
|
190
|
+
The `nexatron-mcp` Python package is the primary artifact. It must be on PyPI before registry entries link to it, because installation commands reference `pip install nexatron-mcp` and `uvx nexatron-mcp`.
|
|
191
|
+
|
|
192
|
+
### Pre-flight checklist
|
|
193
|
+
|
|
194
|
+
- [ ] All tests pass: `cd packages/mcp-server && uv run --with pytest --with pytest-asyncio --with pytest-httpx --with pytest-cov python -m pytest`
|
|
195
|
+
- [ ] Lint clean: `uv run --with ruff ruff check src/ tests/`
|
|
196
|
+
- [ ] Version in `pyproject.toml` and `src/nexatron_mcp/__init__.py` match (currently `1.0.0`).
|
|
197
|
+
- [ ] `CHANGELOG.md` has an entry for the version being published.
|
|
198
|
+
- [ ] Build artifacts are clean: `rm -rf dist/ && uv run --with build python -m build`
|
|
199
|
+
|
|
200
|
+
### Publish steps
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
cd packages/mcp-server
|
|
204
|
+
|
|
205
|
+
# Build wheel and sdist
|
|
206
|
+
uv run --with build python -m build
|
|
207
|
+
|
|
208
|
+
# Check the dist before upload
|
|
209
|
+
uv run --with twine twine check dist/*
|
|
210
|
+
|
|
211
|
+
# Upload to PyPI (requires PyPI account with push rights to nexatron-mcp)
|
|
212
|
+
uv run --with twine twine upload dist/*
|
|
213
|
+
# You will be prompted for a PyPI API token (not a username/password).
|
|
214
|
+
# Store the token in your password manager, not in any file committed to git.
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
Alternatively, the GitHub Actions workflow `.github/workflows/mcp-publish.yml` (tag-triggered on `mcp-server-v*`) runs this via PyPI trusted publishing (OIDC) without a stored token — preferred for CI — and then publishes `server.json` to the MCP Registry.
|
|
218
|
+
|
|
219
|
+
After upload, verify at https://pypi.org/project/nexatron-mcp/.
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
## 2. Anthropic MCP Directory (open registry)
|
|
224
|
+
|
|
225
|
+
The Anthropic open MCP directory is maintained as a GitHub repository at https://github.com/modelcontextprotocol/servers. Listing is via pull request.
|
|
226
|
+
|
|
227
|
+
### What to prepare
|
|
228
|
+
|
|
229
|
+
The directory uses a YAML entry per server. The proposed entry (ready to copy) is in `docs/integrations/anthropic-directory-submission.md` section 6. It looks like this:
|
|
230
|
+
|
|
231
|
+
```yaml
|
|
232
|
+
- name: nexatron
|
|
233
|
+
description: Ask questions about your enterprise data in plain English. AI analytics engine from dotSolved.
|
|
234
|
+
category: data-analytics
|
|
235
|
+
homepage: https://nexatron.io
|
|
236
|
+
source: https://github.com/sravanmodugula-solved/nexatron/tree/main/packages/mcp-server
|
|
237
|
+
package: nexatron-mcp
|
|
238
|
+
install: uvx nexatron-mcp
|
|
239
|
+
license: MIT
|
|
240
|
+
maintainer: dotSolved Systems, Inc.
|
|
241
|
+
maintainer_email: nexatron@dotsolved.com
|
|
242
|
+
supports_remote: true
|
|
243
|
+
remote_manifest: https://api.nexatron.io/.well-known/mcp/server.json
|
|
244
|
+
tags:
|
|
245
|
+
- data
|
|
246
|
+
- analytics
|
|
247
|
+
- bi
|
|
248
|
+
- nl-to-sql
|
|
249
|
+
- semantic-layer
|
|
250
|
+
- enterprise
|
|
251
|
+
- soc2
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
### Submission steps
|
|
255
|
+
|
|
256
|
+
1. Fork https://github.com/modelcontextprotocol/servers.
|
|
257
|
+
2. Add the YAML entry above to the appropriate category file (check the repo structure; it likely has a `servers/data-analytics/` directory or a top-level `servers.yaml`).
|
|
258
|
+
3. Open a pull request with the title: `Add Nexatron MCP server (nexatron-mcp)`.
|
|
259
|
+
4. Use the PR description template from `docs/integrations/anthropic-directory-submission.md` Appendix B.
|
|
260
|
+
5. Assign the PR to a dotSolved engineer to monitor and respond to reviewer comments.
|
|
261
|
+
|
|
262
|
+
### Notes
|
|
263
|
+
|
|
264
|
+
- The `nexatron-mcp` package must be on PyPI before submitting, because reviewers will run `uvx nexatron-mcp` to verify.
|
|
265
|
+
- The `.well-known/mcp/server.json` endpoint must be live and return a valid manifest. The static file is at `docs/integrations/nexatron-mcp-manifest.json`; the backend serves it from `app/api/wellknown.py` (verify that endpoint is deployed).
|
|
266
|
+
- Estimated Anthropic review time: 1-7 business days based on past community submissions.
|
|
267
|
+
|
|
268
|
+
---
|
|
269
|
+
|
|
270
|
+
## 3. Cursor MCP Registry
|
|
271
|
+
|
|
272
|
+
Cursor maintains a list of community MCP servers at https://docs.cursor.com/context/model-context-protocol. Listing is via a GitHub PR or a submission form (check the current Cursor docs for the live submission process, as it changes).
|
|
273
|
+
|
|
274
|
+
### What to prepare
|
|
275
|
+
|
|
276
|
+
Cursor's listing requires:
|
|
277
|
+
- Server name, description, install command, and homepage URL.
|
|
278
|
+
- Confirmation that the server follows MCP 2024-11 spec.
|
|
279
|
+
- A working demo (optionally, a short screen recording).
|
|
280
|
+
|
|
281
|
+
### Submission steps
|
|
282
|
+
|
|
283
|
+
1. Check https://docs.cursor.com/context/model-context-protocol for the current submission mechanism (PR vs form).
|
|
284
|
+
2. If PR-based, fork the relevant Cursor docs/registry repo and add an entry:
|
|
285
|
+
```json
|
|
286
|
+
{
|
|
287
|
+
"name": "Nexatron",
|
|
288
|
+
"description": "AI analytics engine from dotSolved — ask questions about enterprise data in plain English. 12 tools including NL-to-SQL, semantic layer metrics, and RAG search.",
|
|
289
|
+
"install": "uvx nexatron-mcp",
|
|
290
|
+
"homepage": "https://nexatron.io",
|
|
291
|
+
"category": "data"
|
|
292
|
+
}
|
|
293
|
+
```
|
|
294
|
+
3. Include a link to `docs/integrations/claude-install.md#cursor` for the full Cursor install guide.
|
|
295
|
+
4. Contact Cursor through their developer relations channel if a partnership tier listing is desired.
|
|
296
|
+
|
|
297
|
+
### Cursor-specific config location
|
|
298
|
+
|
|
299
|
+
For user reference, the Cursor config file is `.cursor/mcp.json` at the project root or `~/.cursor/mcp.json` for global scope. The `npx @nexatron/create-mcp --client cursor` command writes this file automatically.
|
|
300
|
+
|
|
301
|
+
---
|
|
302
|
+
|
|
303
|
+
## 4. Claude Desktop (Anthropic Connector Partner Program)
|
|
304
|
+
|
|
305
|
+
Getting listed in the curated claude.ai connectors list (the built-in integration picker users see when they open Settings > Integrations) requires partnership approval from Anthropic's platform team. This is separate from the open directory submission in section 2.
|
|
306
|
+
|
|
307
|
+
### What Anthropic requires
|
|
308
|
+
|
|
309
|
+
From the Connector Partner Program application (based on public documentation as of April 2026):
|
|
310
|
+
- Working remote MCP server accessible via HTTPS.
|
|
311
|
+
- OAuth 2.1 with PKCE (the Nexatron backend already implements this).
|
|
312
|
+
- RFC 8414 server metadata at `/.well-known/oauth-authorization-server`.
|
|
313
|
+
- RFC 9728 protected resource metadata at `/.well-known/oauth-protected-resource`.
|
|
314
|
+
- The server manifest at `/.well-known/mcp/server.json` (live at `https://api.nexatron.io/.well-known/mcp/server.json`).
|
|
315
|
+
- Demonstrated security posture (SOC 2, pen test results, etc.).
|
|
316
|
+
- A point of contact at the partner company.
|
|
317
|
+
|
|
318
|
+
All of the above are either already built or documented in `docs/integrations/anthropic-directory-submission.md`.
|
|
319
|
+
|
|
320
|
+
### Submission steps
|
|
321
|
+
|
|
322
|
+
1. Email `partners@anthropic.com` with the subject: `Nexatron MCP Connector Partner Application`.
|
|
323
|
+
2. Attach or link to `docs/integrations/anthropic-directory-submission.md` as the dossier.
|
|
324
|
+
3. Confirm the remote MCP endpoint is live and the OAuth flow completes end-to-end (test with a claude.ai Pro account before submitting).
|
|
325
|
+
4. Ashok Rao (founder, dotSolved) is the business contact; route partnership discussions through him.
|
|
326
|
+
5. Nexatron Engineering (`nexatron@dotsolved.com`) handles technical questions.
|
|
327
|
+
|
|
328
|
+
### Pre-flight for remote MCP
|
|
329
|
+
|
|
330
|
+
Before submitting, verify:
|
|
331
|
+
|
|
332
|
+
```bash
|
|
333
|
+
# Manifest is live
|
|
334
|
+
curl https://api.nexatron.io/.well-known/mcp/server.json | python3 -m json.tool
|
|
335
|
+
|
|
336
|
+
# OAuth server metadata
|
|
337
|
+
curl https://api.nexatron.io/.well-known/oauth-authorization-server | python3 -m json.tool
|
|
338
|
+
|
|
339
|
+
# Protected resource metadata
|
|
340
|
+
curl https://api.nexatron.io/.well-known/oauth-protected-resource | python3 -m json.tool
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
All three must return valid JSON with no 404/500. The MCP server endpoint itself:
|
|
344
|
+
|
|
345
|
+
```bash
|
|
346
|
+
# Should return 200 or 405 (not 404)
|
|
347
|
+
curl -I https://api.nexatron.io/api/v1/mcp
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
---
|
|
351
|
+
|
|
352
|
+
## 5. npm — publish `@nexatron/create-mcp`
|
|
353
|
+
|
|
354
|
+
The scaffolding CLI in `packages/create-nexatron-mcp/` should be published to npm so users can run `npx @nexatron/create-mcp`.
|
|
355
|
+
|
|
356
|
+
### Pre-flight checklist
|
|
357
|
+
|
|
358
|
+
- [ ] Node tests pass: `cd packages/create-nexatron-mcp && node --test src/index.test.js`
|
|
359
|
+
- [ ] Version in `package.json` is correct.
|
|
360
|
+
- [ ] `bin.create-nexatron-mcp` points to `./src/index.js`.
|
|
361
|
+
- [ ] `src/index.js` has `#!/usr/bin/env node` as the first line.
|
|
362
|
+
|
|
363
|
+
### Publish steps
|
|
364
|
+
|
|
365
|
+
```bash
|
|
366
|
+
cd packages/create-nexatron-mcp
|
|
367
|
+
|
|
368
|
+
# Dry run — shows what will be published
|
|
369
|
+
npm pack --dry-run
|
|
370
|
+
|
|
371
|
+
# Log in to npm (requires npm account with publish rights to @nexatron org)
|
|
372
|
+
npm login
|
|
373
|
+
|
|
374
|
+
# Publish under the @nexatron scope
|
|
375
|
+
npm publish --access public
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
After publish, verify:
|
|
379
|
+
|
|
380
|
+
```bash
|
|
381
|
+
npx @nexatron/create-mcp --help
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
---
|
|
385
|
+
|
|
386
|
+
## 6. Post-submission tracking
|
|
387
|
+
|
|
388
|
+
| Registry | Status | Notes |
|
|
389
|
+
|----------|--------|-------|
|
|
390
|
+
| PyPI (`nexatron-mcp`) | Not published | Run publish steps above |
|
|
391
|
+
| Anthropic open MCP directory | Not submitted | PR to modelcontextprotocol/servers |
|
|
392
|
+
| Cursor MCP registry | Not submitted | Check current submission mechanism |
|
|
393
|
+
| Anthropic Connector Partner | Not submitted | Email partners@anthropic.com |
|
|
394
|
+
| npm (`@nexatron/create-mcp`) | Not published | Run npm publish steps above |
|
|
395
|
+
|
|
396
|
+
Update this table as each submission progresses.
|
|
397
|
+
|
|
398
|
+
---
|
|
399
|
+
|
|
400
|
+
## 7. Keeping the manifest current
|
|
401
|
+
|
|
402
|
+
The static manifest at `docs/integrations/nexatron-mcp-manifest.json` is the source of truth for the live endpoint at `https://api.nexatron.io/.well-known/mcp/server.json`. When tool names, scopes, or capabilities change:
|
|
403
|
+
|
|
404
|
+
1. Update `docs/integrations/nexatron-mcp-manifest.json`.
|
|
405
|
+
2. Update the backend route that serves it (check `app/api/wellknown.py`).
|
|
406
|
+
3. Update the tool list in `packages/mcp-server/src/nexatron_mcp/server.py`.
|
|
407
|
+
4. Bump the version in `packages/mcp-server/pyproject.toml` and `__init__.py`.
|
|
408
|
+
5. Add a CHANGELOG entry.
|
|
409
|
+
6. Notify any registered partner registries of the change (most accept simple re-submissions).
|