postman-mcp 0.1.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.
- postman_mcp-0.1.0/.github/ISSUE_TEMPLATE/bug_report.yml +104 -0
- postman_mcp-0.1.0/.github/ISSUE_TEMPLATE/config.yml +11 -0
- postman_mcp-0.1.0/.github/ISSUE_TEMPLATE/feature_request.yml +56 -0
- postman_mcp-0.1.0/.github/PULL_REQUEST_TEMPLATE.md +40 -0
- postman_mcp-0.1.0/.github/dependabot.yml +16 -0
- postman_mcp-0.1.0/.github/workflows/ci.yml +70 -0
- postman_mcp-0.1.0/.github/workflows/docs.yml +47 -0
- postman_mcp-0.1.0/.github/workflows/release.yml +47 -0
- postman_mcp-0.1.0/.gitignore +39 -0
- postman_mcp-0.1.0/CHANGELOG.md +45 -0
- postman_mcp-0.1.0/CODE_OF_CONDUCT.md +73 -0
- postman_mcp-0.1.0/CONTRIBUTING.md +81 -0
- postman_mcp-0.1.0/LICENSE +21 -0
- postman_mcp-0.1.0/PKG-INFO +254 -0
- postman_mcp-0.1.0/README.md +210 -0
- postman_mcp-0.1.0/ROADMAP.md +66 -0
- postman_mcp-0.1.0/SECURITY.md +50 -0
- postman_mcp-0.1.0/SUPPORTED_VERSIONS.md +36 -0
- postman_mcp-0.1.0/assets/README.md +84 -0
- postman_mcp-0.1.0/assets/banner/banner.svg +21 -0
- postman_mcp-0.1.0/assets/launch/LAUNCH.md +145 -0
- postman_mcp-0.1.0/assets/logo/logo.svg +6 -0
- postman_mcp-0.1.0/docs/architecture/diff-engine.md +55 -0
- postman_mcp-0.1.0/docs/architecture/engine.md +68 -0
- postman_mcp-0.1.0/docs/architecture/merge-engine.md +65 -0
- postman_mcp-0.1.0/docs/architecture/overview.md +73 -0
- postman_mcp-0.1.0/docs/architecture/resolver.md +82 -0
- postman_mcp-0.1.0/docs/assets/favicon.svg +4 -0
- postman_mcp-0.1.0/docs/assets/logo.svg +6 -0
- postman_mcp-0.1.0/docs/commands/createenv.md +40 -0
- postman_mcp-0.1.0/docs/commands/index.md +50 -0
- postman_mcp-0.1.0/docs/commands/status.md +39 -0
- postman_mcp-0.1.0/docs/commands/sync.md +44 -0
- postman_mcp-0.1.0/docs/commands/syncall.md +43 -0
- postman_mcp-0.1.0/docs/commands/syncapi.md +65 -0
- postman_mcp-0.1.0/docs/commands/syncchanges.md +53 -0
- postman_mcp-0.1.0/docs/development/contributing.md +60 -0
- postman_mcp-0.1.0/docs/development/release-process.md +56 -0
- postman_mcp-0.1.0/docs/frameworks/django.md +39 -0
- postman_mcp-0.1.0/docs/frameworks/express.md +40 -0
- postman_mcp-0.1.0/docs/frameworks/fastapi.md +51 -0
- postman_mcp-0.1.0/docs/frameworks/nestjs.md +36 -0
- postman_mcp-0.1.0/docs/getting-started/configuration.md +76 -0
- postman_mcp-0.1.0/docs/getting-started/installation.md +68 -0
- postman_mcp-0.1.0/docs/getting-started/quickstart.md +85 -0
- postman_mcp-0.1.0/docs/index.md +78 -0
- postman_mcp-0.1.0/docs/roadmap.md +35 -0
- postman_mcp-0.1.0/examples/README.md +33 -0
- postman_mcp-0.1.0/examples/django-rest-framework/README.md +39 -0
- postman_mcp-0.1.0/examples/django-rest-framework/views.py +45 -0
- postman_mcp-0.1.0/examples/express-api/README.md +39 -0
- postman_mcp-0.1.0/examples/express-api/app.js +55 -0
- postman_mcp-0.1.0/examples/express-api/package.json +13 -0
- postman_mcp-0.1.0/examples/fastapi-basic/README.md +54 -0
- postman_mcp-0.1.0/examples/fastapi-basic/app.py +78 -0
- postman_mcp-0.1.0/examples/fastapi-basic/expected-output/post-payments.item.json +59 -0
- postman_mcp-0.1.0/examples/fastapi-basic/requirements.txt +3 -0
- postman_mcp-0.1.0/examples/fastapi-openapi/README.md +52 -0
- postman_mcp-0.1.0/examples/fastapi-openapi/app.py +77 -0
- postman_mcp-0.1.0/examples/fastapi-openapi/requirements.txt +3 -0
- postman_mcp-0.1.0/examples/nestjs-api/README.md +38 -0
- postman_mcp-0.1.0/examples/nestjs-api/payments.controller.ts +47 -0
- postman_mcp-0.1.0/mkdocs.yml +115 -0
- postman_mcp-0.1.0/postman_mcp/__init__.py +8 -0
- postman_mcp-0.1.0/postman_mcp/cli.py +323 -0
- postman_mcp-0.1.0/postman_mcp/commands/createenv.md +17 -0
- postman_mcp-0.1.0/postman_mcp/commands/status.md +14 -0
- postman_mcp-0.1.0/postman_mcp/commands/sync.md +17 -0
- postman_mcp-0.1.0/postman_mcp/commands/syncall.md +17 -0
- postman_mcp-0.1.0/postman_mcp/commands/syncapi.md +21 -0
- postman_mcp-0.1.0/postman_mcp/commands/syncchanges.md +19 -0
- postman_mcp-0.1.0/postman_mcp/config/__init__.py +21 -0
- postman_mcp-0.1.0/postman_mcp/config/store.py +84 -0
- postman_mcp-0.1.0/postman_mcp/diff/__init__.py +5 -0
- postman_mcp-0.1.0/postman_mcp/diff/render.py +88 -0
- postman_mcp-0.1.0/postman_mcp/engine/__init__.py +5 -0
- postman_mcp-0.1.0/postman_mcp/engine/builder.py +202 -0
- postman_mcp-0.1.0/postman_mcp/engine/examples.py +82 -0
- postman_mcp-0.1.0/postman_mcp/engine/tests.py +77 -0
- postman_mcp-0.1.0/postman_mcp/git/__init__.py +10 -0
- postman_mcp-0.1.0/postman_mcp/git/reader.py +83 -0
- postman_mcp-0.1.0/postman_mcp/input/__init__.py +15 -0
- postman_mcp-0.1.0/postman_mcp/input/detect.py +113 -0
- postman_mcp-0.1.0/postman_mcp/input/openapi.py +275 -0
- postman_mcp-0.1.0/postman_mcp/input/parsers/__init__.py +38 -0
- postman_mcp-0.1.0/postman_mcp/input/parsers/base.py +67 -0
- postman_mcp-0.1.0/postman_mcp/input/parsers/django.py +162 -0
- postman_mcp-0.1.0/postman_mcp/input/parsers/express.py +89 -0
- postman_mcp-0.1.0/postman_mcp/input/parsers/fastapi.py +216 -0
- postman_mcp-0.1.0/postman_mcp/input/parsers/nestjs.py +99 -0
- postman_mcp-0.1.0/postman_mcp/input/resolver.py +144 -0
- postman_mcp-0.1.0/postman_mcp/models.py +172 -0
- postman_mcp-0.1.0/postman_mcp/postman/__init__.py +5 -0
- postman_mcp-0.1.0/postman_mcp/postman/client.py +152 -0
- postman_mcp-0.1.0/postman_mcp/postman/merge.py +264 -0
- postman_mcp-0.1.0/postman_mcp/secrets/__init__.py +17 -0
- postman_mcp-0.1.0/postman_mcp/secrets/manager.py +86 -0
- postman_mcp-0.1.0/postman_mcp/server.py +100 -0
- postman_mcp-0.1.0/postman_mcp/service/__init__.py +4 -0
- postman_mcp-0.1.0/postman_mcp/service/context.py +45 -0
- postman_mcp-0.1.0/postman_mcp/service/environment.py +86 -0
- postman_mcp-0.1.0/postman_mcp/service/status.py +71 -0
- postman_mcp-0.1.0/postman_mcp/service/sync.py +276 -0
- postman_mcp-0.1.0/postman_mcp/setup/__init__.py +26 -0
- postman_mcp-0.1.0/postman_mcp/setup/installer.py +40 -0
- postman_mcp-0.1.0/postman_mcp/setup/registration.py +81 -0
- postman_mcp-0.1.0/pyproject.toml +75 -0
- postman_mcp-0.1.0/tests/conftest.py +136 -0
- postman_mcp-0.1.0/tests/test_cli.py +68 -0
- postman_mcp-0.1.0/tests/test_client.py +71 -0
- postman_mcp-0.1.0/tests/test_engine.py +101 -0
- postman_mcp-0.1.0/tests/test_git.py +66 -0
- postman_mcp-0.1.0/tests/test_merge.py +116 -0
- postman_mcp-0.1.0/tests/test_models_config_secrets.py +118 -0
- postman_mcp-0.1.0/tests/test_openapi.py +71 -0
- postman_mcp-0.1.0/tests/test_parsers.py +136 -0
- postman_mcp-0.1.0/tests/test_parsers_ts.py +128 -0
- postman_mcp-0.1.0/tests/test_resolver_and_diff.py +139 -0
- postman_mcp-0.1.0/tests/test_service.py +166 -0
- postman_mcp-0.1.0/tests/test_setup.py +66 -0
- postman_mcp-0.1.0/tests/test_status_and_env.py +101 -0
- postman_mcp-0.1.0/tests/test_test_scripts.py +63 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
name: 🐛 Bug report
|
|
2
|
+
description: Something isn't working the way it should
|
|
3
|
+
title: "[Bug]: "
|
|
4
|
+
labels: ["bug", "triage"]
|
|
5
|
+
body:
|
|
6
|
+
- type: markdown
|
|
7
|
+
attributes:
|
|
8
|
+
value: |
|
|
9
|
+
Thanks for taking the time to file a bug report. The more precise you are, the
|
|
10
|
+
faster we can fix it. Please **do not** include your Postman API key or any
|
|
11
|
+
secret in this report.
|
|
12
|
+
|
|
13
|
+
- type: textarea
|
|
14
|
+
id: what-happened
|
|
15
|
+
attributes:
|
|
16
|
+
label: What happened?
|
|
17
|
+
description: A clear description of the bug, and what you expected instead.
|
|
18
|
+
placeholder: When I ran `/postman:syncapi createPayment`, the body was empty, but I expected...
|
|
19
|
+
validations:
|
|
20
|
+
required: true
|
|
21
|
+
|
|
22
|
+
- type: textarea
|
|
23
|
+
id: repro
|
|
24
|
+
attributes:
|
|
25
|
+
label: Steps to reproduce
|
|
26
|
+
description: Exact commands, in order. Include the framework and how the route is defined.
|
|
27
|
+
placeholder: |
|
|
28
|
+
1. `postman-mcp init` with framework = fastapi
|
|
29
|
+
2. In Claude Code, run `/postman:syncapi createPayment`
|
|
30
|
+
3. See the diff is missing the request body
|
|
31
|
+
validations:
|
|
32
|
+
required: true
|
|
33
|
+
|
|
34
|
+
- type: dropdown
|
|
35
|
+
id: command
|
|
36
|
+
attributes:
|
|
37
|
+
label: Which command?
|
|
38
|
+
options:
|
|
39
|
+
- "postman-mcp init"
|
|
40
|
+
- "postman-mcp doctor"
|
|
41
|
+
- "postman-mcp serve"
|
|
42
|
+
- "/postman:syncapi"
|
|
43
|
+
- "/postman:syncchanges"
|
|
44
|
+
- "/postman:sync"
|
|
45
|
+
- "/postman:syncall"
|
|
46
|
+
- "/postman:createenv"
|
|
47
|
+
- "/postman:status"
|
|
48
|
+
- "Other / not sure"
|
|
49
|
+
validations:
|
|
50
|
+
required: true
|
|
51
|
+
|
|
52
|
+
- type: dropdown
|
|
53
|
+
id: framework
|
|
54
|
+
attributes:
|
|
55
|
+
label: Framework
|
|
56
|
+
options:
|
|
57
|
+
- FastAPI
|
|
58
|
+
- Express
|
|
59
|
+
- Django REST Framework
|
|
60
|
+
- NestJS
|
|
61
|
+
- Other / N/A
|
|
62
|
+
validations:
|
|
63
|
+
required: true
|
|
64
|
+
|
|
65
|
+
- type: dropdown
|
|
66
|
+
id: input-mode
|
|
67
|
+
attributes:
|
|
68
|
+
label: Input mode
|
|
69
|
+
description: From your `postman-mcp.json` → `config.inputMode`.
|
|
70
|
+
options:
|
|
71
|
+
- openapi
|
|
72
|
+
- code
|
|
73
|
+
- not sure
|
|
74
|
+
validations:
|
|
75
|
+
required: true
|
|
76
|
+
|
|
77
|
+
- type: textarea
|
|
78
|
+
id: env
|
|
79
|
+
attributes:
|
|
80
|
+
label: Environment
|
|
81
|
+
description: Output of `postman-mcp version` plus your OS and Python version.
|
|
82
|
+
placeholder: |
|
|
83
|
+
postman-mcp 0.1.0
|
|
84
|
+
Windows 11 / Python 3.12.3
|
|
85
|
+
render: shell
|
|
86
|
+
validations:
|
|
87
|
+
required: true
|
|
88
|
+
|
|
89
|
+
- type: textarea
|
|
90
|
+
id: logs
|
|
91
|
+
attributes:
|
|
92
|
+
label: Relevant output
|
|
93
|
+
description: Error messages, diff output, or `postman-mcp doctor` results. Redact any secrets.
|
|
94
|
+
render: shell
|
|
95
|
+
|
|
96
|
+
- type: checkboxes
|
|
97
|
+
id: checks
|
|
98
|
+
attributes:
|
|
99
|
+
label: Confirmations
|
|
100
|
+
options:
|
|
101
|
+
- label: I have removed any API keys or secrets from this report.
|
|
102
|
+
required: true
|
|
103
|
+
- label: I searched existing issues and this is not a duplicate.
|
|
104
|
+
required: true
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
blank_issues_enabled: false
|
|
2
|
+
contact_links:
|
|
3
|
+
- name: 💬 Questions & discussion
|
|
4
|
+
url: https://github.com/logesh-works/postman-mcp/discussions
|
|
5
|
+
about: Ask a question, share how you use Postman MCP, or propose an idea before filing an issue.
|
|
6
|
+
- name: 🔒 Report a security vulnerability
|
|
7
|
+
url: https://github.com/logesh-works/postman-mcp/security/advisories/new
|
|
8
|
+
about: Please report security issues privately — do not open a public issue.
|
|
9
|
+
- name: 📖 Documentation
|
|
10
|
+
url: https://logesh-works.github.io/postman-mcp/
|
|
11
|
+
about: Installation, commands, configuration, and architecture guides.
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
name: ✨ Feature request
|
|
2
|
+
description: Suggest an idea or improvement
|
|
3
|
+
title: "[Feature]: "
|
|
4
|
+
labels: ["enhancement", "triage"]
|
|
5
|
+
body:
|
|
6
|
+
- type: markdown
|
|
7
|
+
attributes:
|
|
8
|
+
value: |
|
|
9
|
+
Thanks for the idea! Please check the [ROADMAP](../blob/main/ROADMAP.md) first —
|
|
10
|
+
your request may already be planned.
|
|
11
|
+
|
|
12
|
+
- type: textarea
|
|
13
|
+
id: problem
|
|
14
|
+
attributes:
|
|
15
|
+
label: What problem does this solve?
|
|
16
|
+
description: Describe the pain point. Start from the user's situation, not the solution.
|
|
17
|
+
placeholder: When I add a route in a Django `DefaultRouter`, `syncall` misses it because...
|
|
18
|
+
validations:
|
|
19
|
+
required: true
|
|
20
|
+
|
|
21
|
+
- type: textarea
|
|
22
|
+
id: proposal
|
|
23
|
+
attributes:
|
|
24
|
+
label: Proposed solution
|
|
25
|
+
description: What would you like to happen? A command, flag, or behavior change.
|
|
26
|
+
validations:
|
|
27
|
+
required: true
|
|
28
|
+
|
|
29
|
+
- type: textarea
|
|
30
|
+
id: alternatives
|
|
31
|
+
attributes:
|
|
32
|
+
label: Alternatives considered
|
|
33
|
+
description: Other approaches you thought about, and why they fall short.
|
|
34
|
+
|
|
35
|
+
- type: dropdown
|
|
36
|
+
id: area
|
|
37
|
+
attributes:
|
|
38
|
+
label: Area
|
|
39
|
+
options:
|
|
40
|
+
- Engine (request building)
|
|
41
|
+
- Input resolver / OpenAPI
|
|
42
|
+
- Framework parser
|
|
43
|
+
- Commands / CLI
|
|
44
|
+
- Postman client / merge
|
|
45
|
+
- Setup (init / doctor / registration)
|
|
46
|
+
- Docs
|
|
47
|
+
- Other
|
|
48
|
+
validations:
|
|
49
|
+
required: true
|
|
50
|
+
|
|
51
|
+
- type: checkboxes
|
|
52
|
+
id: contribute
|
|
53
|
+
attributes:
|
|
54
|
+
label: Contribution
|
|
55
|
+
options:
|
|
56
|
+
- label: I'm willing to open a pull request for this.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Thanks for contributing! Keep PRs focused on one logical change.
|
|
3
|
+
See CONTRIBUTING.md for the full guidelines.
|
|
4
|
+
-->
|
|
5
|
+
|
|
6
|
+
## Summary
|
|
7
|
+
|
|
8
|
+
<!-- What does this PR do, and why? One or two sentences. -->
|
|
9
|
+
|
|
10
|
+
Fixes #<!-- issue number, if any -->
|
|
11
|
+
|
|
12
|
+
## Type of change
|
|
13
|
+
|
|
14
|
+
- [ ] 🐛 Bug fix (non-breaking change that fixes an issue)
|
|
15
|
+
- [ ] ✨ New feature (non-breaking change that adds functionality)
|
|
16
|
+
- [ ] 💥 Breaking change (fix or feature that changes existing behavior)
|
|
17
|
+
- [ ] 📖 Documentation only
|
|
18
|
+
- [ ] 🧹 Refactor / internal (no user-facing change)
|
|
19
|
+
- [ ] 🧪 Tests only
|
|
20
|
+
|
|
21
|
+
## What changed
|
|
22
|
+
|
|
23
|
+
<!-- Bullet the concrete changes. Reference relevant files where helpful. -->
|
|
24
|
+
|
|
25
|
+
-
|
|
26
|
+
|
|
27
|
+
## How was this tested?
|
|
28
|
+
|
|
29
|
+
<!-- Commands you ran, new tests added, manual verification steps. -->
|
|
30
|
+
|
|
31
|
+
- [ ] `pytest` passes locally
|
|
32
|
+
- [ ] Added/updated tests for the changed behavior
|
|
33
|
+
|
|
34
|
+
## Checklist
|
|
35
|
+
|
|
36
|
+
- [ ] My change matches the surrounding code style
|
|
37
|
+
- [ ] I updated the docs (`docs/`) if I changed a command, flag, or config field
|
|
38
|
+
- [ ] I added an entry under `## [Unreleased]` in `CHANGELOG.md`
|
|
39
|
+
- [ ] No secrets, API keys, or populated `postman-mcp.json` are included
|
|
40
|
+
- [ ] CI is green
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
updates:
|
|
3
|
+
- package-ecosystem: pip
|
|
4
|
+
directory: "/"
|
|
5
|
+
schedule:
|
|
6
|
+
interval: weekly
|
|
7
|
+
groups:
|
|
8
|
+
python-deps:
|
|
9
|
+
patterns: ["*"]
|
|
10
|
+
labels: ["dependencies"]
|
|
11
|
+
|
|
12
|
+
- package-ecosystem: github-actions
|
|
13
|
+
directory: "/"
|
|
14
|
+
schedule:
|
|
15
|
+
interval: weekly
|
|
16
|
+
labels: ["dependencies", "ci"]
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
|
|
12
|
+
concurrency:
|
|
13
|
+
group: ci-${{ github.ref }}
|
|
14
|
+
cancel-in-progress: true
|
|
15
|
+
|
|
16
|
+
jobs:
|
|
17
|
+
test:
|
|
18
|
+
name: test (py${{ matrix.python-version }} · ${{ matrix.os }})
|
|
19
|
+
runs-on: ${{ matrix.os }}
|
|
20
|
+
strategy:
|
|
21
|
+
fail-fast: false
|
|
22
|
+
matrix:
|
|
23
|
+
os: [ubuntu-latest, macos-latest, windows-latest]
|
|
24
|
+
python-version: ["3.10", "3.11", "3.12", "3.13"]
|
|
25
|
+
steps:
|
|
26
|
+
- uses: actions/checkout@v4
|
|
27
|
+
|
|
28
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
29
|
+
uses: actions/setup-python@v5
|
|
30
|
+
with:
|
|
31
|
+
python-version: ${{ matrix.python-version }}
|
|
32
|
+
cache: pip
|
|
33
|
+
|
|
34
|
+
- name: Install
|
|
35
|
+
run: |
|
|
36
|
+
python -m pip install --upgrade pip
|
|
37
|
+
pip install -e ".[dev]"
|
|
38
|
+
|
|
39
|
+
- name: Run tests
|
|
40
|
+
run: pytest --cov --cov-report=xml --cov-report=term-missing
|
|
41
|
+
|
|
42
|
+
- name: Upload coverage to Codecov
|
|
43
|
+
if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.12'
|
|
44
|
+
uses: codecov/codecov-action@v4
|
|
45
|
+
with:
|
|
46
|
+
files: coverage.xml
|
|
47
|
+
fail_ci_if_error: false
|
|
48
|
+
env:
|
|
49
|
+
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
|
50
|
+
|
|
51
|
+
build:
|
|
52
|
+
name: build (sdist + wheel)
|
|
53
|
+
runs-on: ubuntu-latest
|
|
54
|
+
steps:
|
|
55
|
+
- uses: actions/checkout@v4
|
|
56
|
+
- uses: actions/setup-python@v5
|
|
57
|
+
with:
|
|
58
|
+
python-version: "3.12"
|
|
59
|
+
- name: Build
|
|
60
|
+
run: |
|
|
61
|
+
python -m pip install --upgrade pip build
|
|
62
|
+
python -m build
|
|
63
|
+
- name: Check metadata
|
|
64
|
+
run: |
|
|
65
|
+
pip install twine
|
|
66
|
+
twine check dist/*
|
|
67
|
+
- uses: actions/upload-artifact@v4
|
|
68
|
+
with:
|
|
69
|
+
name: dist
|
|
70
|
+
path: dist/
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
name: Docs
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
paths:
|
|
7
|
+
- "docs/**"
|
|
8
|
+
- "mkdocs.yml"
|
|
9
|
+
- ".github/workflows/docs.yml"
|
|
10
|
+
workflow_dispatch:
|
|
11
|
+
|
|
12
|
+
permissions:
|
|
13
|
+
contents: read
|
|
14
|
+
pages: write
|
|
15
|
+
id-token: write
|
|
16
|
+
|
|
17
|
+
concurrency:
|
|
18
|
+
group: pages
|
|
19
|
+
cancel-in-progress: false
|
|
20
|
+
|
|
21
|
+
jobs:
|
|
22
|
+
build:
|
|
23
|
+
runs-on: ubuntu-latest
|
|
24
|
+
steps:
|
|
25
|
+
- uses: actions/checkout@v4
|
|
26
|
+
- uses: actions/setup-python@v5
|
|
27
|
+
with:
|
|
28
|
+
python-version: "3.12"
|
|
29
|
+
cache: pip
|
|
30
|
+
- name: Install docs dependencies
|
|
31
|
+
run: pip install -e ".[docs]"
|
|
32
|
+
- name: Build site
|
|
33
|
+
run: mkdocs build --strict
|
|
34
|
+
- uses: actions/upload-pages-artifact@v3
|
|
35
|
+
with:
|
|
36
|
+
path: site
|
|
37
|
+
|
|
38
|
+
deploy:
|
|
39
|
+
needs: build
|
|
40
|
+
runs-on: ubuntu-latest
|
|
41
|
+
environment:
|
|
42
|
+
name: github-pages
|
|
43
|
+
url: ${{ steps.deployment.outputs.page_url }}
|
|
44
|
+
steps:
|
|
45
|
+
- name: Deploy to GitHub Pages
|
|
46
|
+
id: deployment
|
|
47
|
+
uses: actions/deploy-pages@v4
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published]
|
|
6
|
+
|
|
7
|
+
permissions:
|
|
8
|
+
contents: read
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
build:
|
|
12
|
+
name: Build distribution
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@v4
|
|
16
|
+
- uses: actions/setup-python@v5
|
|
17
|
+
with:
|
|
18
|
+
python-version: "3.12"
|
|
19
|
+
- name: Build sdist and wheel
|
|
20
|
+
run: |
|
|
21
|
+
python -m pip install --upgrade pip build
|
|
22
|
+
python -m build
|
|
23
|
+
- name: Check metadata
|
|
24
|
+
run: |
|
|
25
|
+
pip install twine
|
|
26
|
+
twine check dist/*
|
|
27
|
+
- uses: actions/upload-artifact@v4
|
|
28
|
+
with:
|
|
29
|
+
name: dist
|
|
30
|
+
path: dist/
|
|
31
|
+
|
|
32
|
+
publish:
|
|
33
|
+
name: Publish to PyPI
|
|
34
|
+
needs: build
|
|
35
|
+
runs-on: ubuntu-latest
|
|
36
|
+
environment:
|
|
37
|
+
name: pypi
|
|
38
|
+
url: https://pypi.org/project/postman-mcp/
|
|
39
|
+
permissions:
|
|
40
|
+
id-token: write # OIDC trusted publishing — no API token stored in the repo
|
|
41
|
+
steps:
|
|
42
|
+
- uses: actions/download-artifact@v4
|
|
43
|
+
with:
|
|
44
|
+
name: dist
|
|
45
|
+
path: dist/
|
|
46
|
+
- name: Publish
|
|
47
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*.egg-info/
|
|
5
|
+
.eggs/
|
|
6
|
+
build/
|
|
7
|
+
dist/
|
|
8
|
+
.venv/
|
|
9
|
+
venv/
|
|
10
|
+
*.spec
|
|
11
|
+
.env
|
|
12
|
+
.env.*
|
|
13
|
+
|
|
14
|
+
# Node (examples/express-api, examples/nestjs-api)
|
|
15
|
+
node_modules/
|
|
16
|
+
|
|
17
|
+
# Test / coverage
|
|
18
|
+
.pytest_cache/
|
|
19
|
+
.coverage
|
|
20
|
+
.coverage.*
|
|
21
|
+
htmlcov/
|
|
22
|
+
coverage.xml
|
|
23
|
+
.tox/
|
|
24
|
+
.mypy_cache/
|
|
25
|
+
.ruff_cache/
|
|
26
|
+
|
|
27
|
+
# MkDocs build output (the docs/ *source* is tracked; only the built site is ignored)
|
|
28
|
+
site/
|
|
29
|
+
|
|
30
|
+
# postman-mcp runtime artifacts (also added by `init`)
|
|
31
|
+
.postman-mcp.secret
|
|
32
|
+
postman-mcp.json
|
|
33
|
+
|
|
34
|
+
# OS / editor
|
|
35
|
+
.DS_Store
|
|
36
|
+
Thumbs.db
|
|
37
|
+
.idea/
|
|
38
|
+
.vscode/
|
|
39
|
+
*.swp
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project are documented here.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- Open-source repository foundation: `LICENSE`, `CONTRIBUTING`, `CODE_OF_CONDUCT`,
|
|
12
|
+
`SECURITY`, `SUPPORTED_VERSIONS`, `ROADMAP`, GitHub issue/PR templates, CI and release
|
|
13
|
+
workflows, MkDocs Material documentation site, and `examples/`.
|
|
14
|
+
- **Test suite** under `tests/` — 120 tests, 83% coverage, all Postman REST calls mocked
|
|
15
|
+
with `respx`. Covers the engine, OpenAPI mapper, all four code parsers, merge
|
|
16
|
+
idempotency/preservation, the diff renderer, the two-phase confirm contract end to end,
|
|
17
|
+
the Postman client (auth/retry), setup install/registration, and the CLI `doctor`.
|
|
18
|
+
|
|
19
|
+
## [0.1.0] — Unreleased (MVP)
|
|
20
|
+
|
|
21
|
+
First MVP release.
|
|
22
|
+
|
|
23
|
+
### Added
|
|
24
|
+
- **Setup chain** — `postman-mcp init` (API-key handshake, workspace/collection pick,
|
|
25
|
+
config write, MCP-server registration, slash-command install), `postman-mcp doctor`,
|
|
26
|
+
`postman-mcp serve`, `postman-mcp version`.
|
|
27
|
+
- **The engine** — `RouteModel` → Postman Collection v2.1 item: method/URL, params,
|
|
28
|
+
request body with realistic examples, auth headers, success + error responses, and a
|
|
29
|
+
three-tier test scaffold (status + schema shipped; business-logic gated off).
|
|
30
|
+
- **Input resolution** — OpenAPI-first (one mapper for FastAPI / NestJS / DRF), with
|
|
31
|
+
framework code-parsing fallback (FastAPI, Express, Django REST Framework, NestJS) and
|
|
32
|
+
per-route mixing.
|
|
33
|
+
- **Commands** — `/postman:syncapi`, `/postman:syncchanges`, `/postman:sync`,
|
|
34
|
+
`/postman:syncall`, `/postman:createenv`, `/postman:status`.
|
|
35
|
+
- **Safety** — diff before every write, human-owned scripts/examples preserved across
|
|
36
|
+
syncs, soft deletes by default, secrets stored by reference only.
|
|
37
|
+
|
|
38
|
+
### Known gaps
|
|
39
|
+
- A live end-to-end run against a real Postman workspace is still pending (tests mock the
|
|
40
|
+
REST API) — a release gate for `0.1.0`. See [ROADMAP.md](ROADMAP.md).
|
|
41
|
+
- TS parsers (Express/NestJS) are heuristic; Django router-registered viewsets are not
|
|
42
|
+
yet fully resolved.
|
|
43
|
+
|
|
44
|
+
[Unreleased]: https://github.com/logesh-works/postman-mcp/compare/v0.1.0...HEAD
|
|
45
|
+
[0.1.0]: https://github.com/logesh-works/postman-mcp/releases/tag/v0.1.0
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# Contributor Covenant Code of Conduct
|
|
2
|
+
|
|
3
|
+
## Our Pledge
|
|
4
|
+
|
|
5
|
+
We as members, contributors, and leaders pledge to make participation in our community a
|
|
6
|
+
harassment-free experience for everyone, regardless of age, body size, visible or
|
|
7
|
+
invisible disability, ethnicity, sex characteristics, gender identity and expression,
|
|
8
|
+
level of experience, education, socio-economic status, nationality, personal appearance,
|
|
9
|
+
race, religion, or sexual identity and orientation.
|
|
10
|
+
|
|
11
|
+
We pledge to act and interact in ways that contribute to an open, welcoming, diverse,
|
|
12
|
+
inclusive, and healthy community.
|
|
13
|
+
|
|
14
|
+
## Our Standards
|
|
15
|
+
|
|
16
|
+
Examples of behavior that contributes to a positive environment:
|
|
17
|
+
|
|
18
|
+
- Demonstrating empathy and kindness toward other people
|
|
19
|
+
- Being respectful of differing opinions, viewpoints, and experiences
|
|
20
|
+
- Giving and gracefully accepting constructive feedback
|
|
21
|
+
- Accepting responsibility and apologizing to those affected by our mistakes
|
|
22
|
+
- Focusing on what is best for the overall community
|
|
23
|
+
|
|
24
|
+
Examples of unacceptable behavior:
|
|
25
|
+
|
|
26
|
+
- The use of sexualized language or imagery, and sexual attention or advances of any kind
|
|
27
|
+
- Trolling, insulting or derogatory comments, and personal or political attacks
|
|
28
|
+
- Public or private harassment
|
|
29
|
+
- Publishing others' private information, such as a physical or email address, without
|
|
30
|
+
their explicit permission
|
|
31
|
+
- Other conduct which could reasonably be considered inappropriate in a professional
|
|
32
|
+
setting
|
|
33
|
+
|
|
34
|
+
## Enforcement Responsibilities
|
|
35
|
+
|
|
36
|
+
Community leaders are responsible for clarifying and enforcing our standards of
|
|
37
|
+
acceptable behavior and will take appropriate and fair corrective action in response to
|
|
38
|
+
any behavior that they deem inappropriate, threatening, offensive, or harmful.
|
|
39
|
+
|
|
40
|
+
## Scope
|
|
41
|
+
|
|
42
|
+
This Code of Conduct applies within all community spaces, and also applies when an
|
|
43
|
+
individual is officially representing the community in public spaces.
|
|
44
|
+
|
|
45
|
+
## Enforcement
|
|
46
|
+
|
|
47
|
+
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to
|
|
48
|
+
the community leaders responsible for enforcement at **logeshkumar.dev@gmail.com**. All
|
|
49
|
+
complaints will be reviewed and investigated promptly and fairly.
|
|
50
|
+
|
|
51
|
+
All community leaders are obligated to respect the privacy and security of the reporter
|
|
52
|
+
of any incident.
|
|
53
|
+
|
|
54
|
+
## Enforcement Guidelines
|
|
55
|
+
|
|
56
|
+
Community leaders will follow these Community Impact Guidelines in determining the
|
|
57
|
+
consequences for any action they deem in violation of this Code of Conduct:
|
|
58
|
+
|
|
59
|
+
1. **Correction** — A private, written warning, providing clarity around the nature of
|
|
60
|
+
the violation and an explanation of why the behavior was inappropriate.
|
|
61
|
+
2. **Warning** — A warning with consequences for continued behavior.
|
|
62
|
+
3. **Temporary Ban** — A temporary ban from any sort of interaction or public
|
|
63
|
+
communication with the community for a specified period of time.
|
|
64
|
+
4. **Permanent Ban** — A permanent ban from any sort of public interaction within the
|
|
65
|
+
community.
|
|
66
|
+
|
|
67
|
+
## Attribution
|
|
68
|
+
|
|
69
|
+
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.1,
|
|
70
|
+
available at
|
|
71
|
+
https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.
|
|
72
|
+
|
|
73
|
+
[homepage]: https://www.contributor-covenant.org
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# Contributing to Postman MCP
|
|
2
|
+
|
|
3
|
+
Thanks for taking the time to contribute. Postman MCP is an open-source MCP server
|
|
4
|
+
that syncs API code into Postman collections. This guide gets you from a fresh clone to
|
|
5
|
+
a green test run and a clean pull request.
|
|
6
|
+
|
|
7
|
+
## Code of Conduct
|
|
8
|
+
|
|
9
|
+
This project follows the [Contributor Covenant](CODE_OF_CONDUCT.md). By participating you
|
|
10
|
+
agree to uphold it. Report unacceptable behavior to the address listed there.
|
|
11
|
+
|
|
12
|
+
## Ways to contribute
|
|
13
|
+
|
|
14
|
+
- **Report a bug** — open a [bug report](https://github.com/logesh-works/postman-mcp/issues/new?template=bug_report.yml).
|
|
15
|
+
- **Request a feature** — open a [feature request](https://github.com/logesh-works/postman-mcp/issues/new?template=feature_request.yml).
|
|
16
|
+
- **Improve docs** — everything under `docs/` is fair game; small fixes can go straight to a PR.
|
|
17
|
+
- **Add framework coverage** — new or better parsers under `postman_mcp/input/parsers/`.
|
|
18
|
+
- **Write tests** — coverage gaps are tracked in [ROADMAP.md](ROADMAP.md) and issues.
|
|
19
|
+
|
|
20
|
+
## Development setup
|
|
21
|
+
|
|
22
|
+
Requires **Python ≥ 3.10** and `git` on your PATH.
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
git clone https://github.com/logesh-works/postman-mcp
|
|
26
|
+
cd postman-mcp
|
|
27
|
+
|
|
28
|
+
python -m venv .venv
|
|
29
|
+
# Windows (PowerShell): .venv\Scripts\Activate.ps1
|
|
30
|
+
# macOS / Linux: source .venv/bin/activate
|
|
31
|
+
|
|
32
|
+
pip install -e ".[dev]"
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
This installs the package in editable mode plus the dev tools (`pytest`, `pytest-cov`,
|
|
36
|
+
`respx`). After install, `postman-mcp version` should print the current version.
|
|
37
|
+
|
|
38
|
+
## Running the checks
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
pytest # run the test suite
|
|
42
|
+
pytest --cov # with coverage (target: >80%)
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
All tests mock the Postman REST API via `respx` — **no real Postman API key is needed**
|
|
46
|
+
and no network calls are made. Never commit a real API key or a populated
|
|
47
|
+
`postman-mcp.json` / `.postman-mcp.secret`.
|
|
48
|
+
|
|
49
|
+
## Architecture in one paragraph
|
|
50
|
+
|
|
51
|
+
The five sync commands are **one engine plus five selectors**. The engine
|
|
52
|
+
(`engine/builder.py`) turns a normalized `RouteModel` into a Postman Collection v2.1
|
|
53
|
+
item. The input resolver (`input/resolver.py`) produces that `RouteModel` from the best
|
|
54
|
+
available source — an OpenAPI spec when one exists, framework code parsing otherwise.
|
|
55
|
+
The service layer (`service/`) orchestrates read → diff → confirm → write against the
|
|
56
|
+
Postman client (`postman/`). See [docs/architecture/overview.md](docs/architecture/overview.md)
|
|
57
|
+
for the full picture.
|
|
58
|
+
|
|
59
|
+
## Pull request guidelines
|
|
60
|
+
|
|
61
|
+
1. **Branch** from `main`: `git checkout -b fix/short-description`.
|
|
62
|
+
2. **Keep PRs focused** — one logical change. Unrelated cleanups go in their own PR.
|
|
63
|
+
3. **Add tests** for any behavior change. Bug fixes should include a regression test.
|
|
64
|
+
4. **Update docs** when you change a command, flag, or config field.
|
|
65
|
+
5. **Update [CHANGELOG.md](CHANGELOG.md)** under the `## [Unreleased]` heading.
|
|
66
|
+
6. **Match the surrounding style** — the code favors small, single-responsibility modules
|
|
67
|
+
and comments that explain the *why*, not the *what*.
|
|
68
|
+
7. Fill out the PR template; link the issue your PR closes.
|
|
69
|
+
|
|
70
|
+
A maintainer will review. CI must be green before merge.
|
|
71
|
+
|
|
72
|
+
## Commit messages
|
|
73
|
+
|
|
74
|
+
Use clear, present-tense summaries (`Add NestJS guard detection`, not `added stuff`).
|
|
75
|
+
Reference issues with `Fixes #123` where applicable. Conventional Commits prefixes
|
|
76
|
+
(`feat:`, `fix:`, `docs:`, `test:`, `refactor:`) are welcome but not required.
|
|
77
|
+
|
|
78
|
+
## Reporting security issues
|
|
79
|
+
|
|
80
|
+
**Do not** open a public issue for security vulnerabilities. Follow
|
|
81
|
+
[SECURITY.md](SECURITY.md).
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Logesh Kumar (logeshkumar.in)
|
|
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.
|