quera-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.
- quera_mcp-0.1.0/.github/ISSUE_TEMPLATE/bug_report.yml +42 -0
- quera_mcp-0.1.0/.github/ISSUE_TEMPLATE/config.yml +5 -0
- quera_mcp-0.1.0/.github/dependabot.yml +10 -0
- quera_mcp-0.1.0/.github/workflows/ci.yml +22 -0
- quera_mcp-0.1.0/.github/workflows/publish.yml +51 -0
- quera_mcp-0.1.0/.gitignore +6 -0
- quera_mcp-0.1.0/LICENSE +21 -0
- quera_mcp-0.1.0/PKG-INFO +129 -0
- quera_mcp-0.1.0/README.md +102 -0
- quera_mcp-0.1.0/pyproject.toml +55 -0
- quera_mcp-0.1.0/server.json +32 -0
- quera_mcp-0.1.0/src/quera_mcp/__init__.py +5 -0
- quera_mcp-0.1.0/src/quera_mcp/http.py +290 -0
- quera_mcp-0.1.0/src/quera_mcp/quera.py +715 -0
- quera_mcp-0.1.0/src/quera_mcp/registry.py +16 -0
- quera_mcp-0.1.0/src/quera_mcp/server.py +91 -0
- quera_mcp-0.1.0/tests/conftest.py +88 -0
- quera_mcp-0.1.0/tests/fixtures/bootcamp.json +166 -0
- quera_mcp-0.1.0/tests/fixtures/bootcamps.json +100 -0
- quera_mcp-0.1.0/tests/fixtures/college.json +1 -0
- quera_mcp-0.1.0/tests/fixtures/companies.json +1 -0
- quera_mcp-0.1.0/tests/fixtures/company.json +1 -0
- quera_mcp-0.1.0/tests/fixtures/company_jobs.json +1 -0
- quera_mcp-0.1.0/tests/fixtures/contest.json +1 -0
- quera_mcp-0.1.0/tests/fixtures/contest_search.json +1 -0
- quera_mcp-0.1.0/tests/fixtures/event.json +69 -0
- quera_mcp-0.1.0/tests/fixtures/job.json +1 -0
- quera_mcp-0.1.0/tests/fixtures/jobs.json +1 -0
- quera_mcp-0.1.0/tests/fixtures/problem.json +1 -0
- quera_mcp-0.1.0/tests/fixtures/problem_filters.json +199 -0
- quera_mcp-0.1.0/tests/fixtures/problems.json +1 -0
- quera_mcp-0.1.0/tests/fixtures/wp_categories.json +1 -0
- quera_mcp-0.1.0/tests/fixtures/wp_posts.json +1 -0
- quera_mcp-0.1.0/tests/test_live_quera.py +75 -0
- quera_mcp-0.1.0/tests/test_quera.py +287 -0
- quera_mcp-0.1.0/uv.lock +1362 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
name: Bug report
|
|
2
|
+
description: A tool failed or returned wrong data
|
|
3
|
+
labels: [bug]
|
|
4
|
+
body:
|
|
5
|
+
- type: input
|
|
6
|
+
id: tool
|
|
7
|
+
attributes:
|
|
8
|
+
label: Tool
|
|
9
|
+
description: Which tool, e.g. bl_search
|
|
10
|
+
validations:
|
|
11
|
+
required: true
|
|
12
|
+
- type: textarea
|
|
13
|
+
id: input
|
|
14
|
+
attributes:
|
|
15
|
+
label: Arguments and result
|
|
16
|
+
description: The arguments the agent sent and the error or wrong output. Remove anything personal.
|
|
17
|
+
render: json
|
|
18
|
+
validations:
|
|
19
|
+
required: true
|
|
20
|
+
- type: textarea
|
|
21
|
+
id: expected
|
|
22
|
+
attributes:
|
|
23
|
+
label: What you expected
|
|
24
|
+
description: e.g. what quera.org shows for the same query
|
|
25
|
+
- type: input
|
|
26
|
+
id: client
|
|
27
|
+
attributes:
|
|
28
|
+
label: MCP client and OS
|
|
29
|
+
placeholder: Claude Desktop 1.x on Windows 11
|
|
30
|
+
- type: dropdown
|
|
31
|
+
id: network
|
|
32
|
+
attributes:
|
|
33
|
+
label: Network
|
|
34
|
+
options:
|
|
35
|
+
- Direct connection
|
|
36
|
+
- VPN or proxy
|
|
37
|
+
- QUERA_MCP_PROXY set
|
|
38
|
+
- type: input
|
|
39
|
+
id: version
|
|
40
|
+
attributes:
|
|
41
|
+
label: quera-mcp version
|
|
42
|
+
placeholder: "0.1.0"
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
test:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
strategy:
|
|
12
|
+
matrix:
|
|
13
|
+
python: ["3.10", "3.11", "3.12", "3.13"]
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@v7
|
|
16
|
+
- uses: astral-sh/setup-uv@v10.2.0
|
|
17
|
+
with:
|
|
18
|
+
python-version: ${{ matrix.python }}
|
|
19
|
+
- run: uv sync --locked
|
|
20
|
+
- run: uv run ruff check .
|
|
21
|
+
- run: uv run ruff format --check .
|
|
22
|
+
- run: uv run pytest -q
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
name: Publish
|
|
2
|
+
|
|
3
|
+
# Tag a release (git tag v0.1.0 && git push --tags) after bumping the version in
|
|
4
|
+
# pyproject.toml and server.json.
|
|
5
|
+
on:
|
|
6
|
+
push:
|
|
7
|
+
tags: ["v*"]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
pypi:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
environment: pypi
|
|
13
|
+
permissions:
|
|
14
|
+
id-token: write # PyPI trusted publishing
|
|
15
|
+
contents: write # GitHub Release
|
|
16
|
+
steps:
|
|
17
|
+
- uses: actions/checkout@v7
|
|
18
|
+
- uses: astral-sh/setup-uv@v10.2.0
|
|
19
|
+
- name: Check versions match the tag
|
|
20
|
+
run: |
|
|
21
|
+
TAG=${GITHUB_REF_NAME#v}
|
|
22
|
+
grep -q "^version = \"$TAG\"" pyproject.toml
|
|
23
|
+
test "$(jq -r .version server.json)" = "$TAG"
|
|
24
|
+
test "$(jq -r '.packages[0].version' server.json)" = "$TAG"
|
|
25
|
+
- run: uv sync --locked && uv run pytest -q
|
|
26
|
+
- run: uv build
|
|
27
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|
|
28
|
+
- run: gh release create "$GITHUB_REF_NAME" dist/* --generate-notes --title "$GITHUB_REF_NAME"
|
|
29
|
+
env:
|
|
30
|
+
GH_TOKEN: ${{ github.token }}
|
|
31
|
+
|
|
32
|
+
mcp-registry:
|
|
33
|
+
needs: pypi
|
|
34
|
+
runs-on: ubuntu-latest
|
|
35
|
+
permissions:
|
|
36
|
+
id-token: write # MCP Registry login via GitHub OIDC
|
|
37
|
+
contents: read
|
|
38
|
+
steps:
|
|
39
|
+
- uses: actions/checkout@v7
|
|
40
|
+
- name: Wait for PyPI to serve the new version
|
|
41
|
+
run: |
|
|
42
|
+
for i in $(seq 1 30); do
|
|
43
|
+
curl -sf "https://pypi.org/pypi/quera-mcp/${GITHUB_REF_NAME#v}/json" >/dev/null && exit 0
|
|
44
|
+
sleep 10
|
|
45
|
+
done
|
|
46
|
+
exit 1
|
|
47
|
+
- name: Install mcp-publisher
|
|
48
|
+
run: |
|
|
49
|
+
curl -L "https://github.com/modelcontextprotocol/registry/releases/download/v1.8.1/mcp-publisher_$(uname -s | tr '[:upper:]' '[:lower:]')_$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/').tar.gz" | tar xz mcp-publisher
|
|
50
|
+
- run: ./mcp-publisher login github-oidc
|
|
51
|
+
- run: ./mcp-publisher publish
|
quera_mcp-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Sepehr Radmard
|
|
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.
|
quera_mcp-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: quera-mcp
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Unofficial read-only MCP server for Quera (quera.org): Iranian tech jobs, companies, contests, problems and courses.
|
|
5
|
+
Project-URL: Homepage, https://github.com/sepehr071/quera-mcp
|
|
6
|
+
Project-URL: Issues, https://github.com/sepehr071/quera-mcp/issues
|
|
7
|
+
Project-URL: Website, https://mcpfarsi.ir/
|
|
8
|
+
Author-email: Sepehr Radmard <sepehrr80@gmail.com>
|
|
9
|
+
License-Expression: MIT
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Keywords: claude,coding-problems,courses,iran,jobs,magnet,mcp,model-context-protocol,persian,programming-contests,quera,quera-org,tech-jobs
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: Operating System :: OS Independent
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
21
|
+
Requires-Python: >=3.10
|
|
22
|
+
Requires-Dist: curl-cffi>=0.16.3
|
|
23
|
+
Requires-Dist: httpx-curl-cffi>=0.1.5
|
|
24
|
+
Requires-Dist: httpx>=0.27
|
|
25
|
+
Requires-Dist: mcp<3,>=2.2
|
|
26
|
+
Description-Content-Type: text/markdown
|
|
27
|
+
|
|
28
|
+
<!-- mcp-name: io.github.sepehr071/quera-mcp -->
|
|
29
|
+
|
|
30
|
+
# quera-mcp: Quera (کوئرا) jobs, contests, problems and courses MCP server for AI agents
|
|
31
|
+
|
|
32
|
+
**quera-mcp is an unofficial, read-only MCP server that gives AI agents the public data of Quera (quera.org), the Iranian developer platform.**
|
|
33
|
+
Its 9 tools search tech jobs and companies (Magnet), list programming contests, search and read problems from the public problemset, and browse the College course catalog.
|
|
34
|
+
No API key or Quera account is needed. It works in Claude, Cursor, Copilot and any other MCP client.
|
|
35
|
+
|
|
36
|
+
[](https://pypi.org/project/quera-mcp/)
|
|
37
|
+
[](https://pypi.org/project/quera-mcp/)
|
|
38
|
+
[](https://github.com/sepehr071/quera-mcp/blob/main/LICENSE)
|
|
39
|
+
|
|
40
|
+
[For AI agents](#for-ai-agents) · [Quick start](#quick-start) · [What it can do](#what-it-can-do) · [Tools](#tools) · [FAQ](#faq) · [فارسی](#فارسی)
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## For AI agents
|
|
45
|
+
|
|
46
|
+
- **What:** unofficial MCP server (model context protocol) for quera.org: tech job search with filters (keyword, level, remote, city, tech stack, job type, company, sort), full job postings, company search and profiles, running/upcoming/past programming contests, problem search and statements, and the College course catalog with prices.
|
|
47
|
+
- **Install:** `uvx quera-mcp` or `claude mcp add quera -- uvx quera-mcp`. Transport: stdio. Needs [uv](https://docs.astral.sh/uv/getting-started/installation/) (Python 3.10+).
|
|
48
|
+
- **Auth:** none, no API key or account. Optional `QUERA_MCP_PROXY` (HTTP proxy URL, or a comma-separated list); system proxy settings are ignored.
|
|
49
|
+
- **Access:** read-only. It cannot log in, apply to jobs, submit solutions or register for anything, so no confirmation is needed before calling any tool.
|
|
50
|
+
- **Tools:** 14, all prefixed `qr_`. Typical sequences: `qr_jobs` -> `qr_job` -> `qr_company`; `qr_companies` -> `qr_company`; `qr_problem_filters` -> `qr_problems` -> `qr_problem`; `qr_contests` -> `qr_event`; `qr_courses`; `qr_bootcamps`; `qr_blog`; `qr_salaries`.
|
|
51
|
+
- **Use when:** the user asks about developer jobs in Iran (Tehran, remote, junior, Python...), which companies hire, programming contests, practice problems, or Quera course options and prices.
|
|
52
|
+
- **Do not use when:** the user wants other job boards, personal Quera data (profiles, submissions, rankings) or to apply or submit anything.
|
|
53
|
+
- **Output:** compact JSON. Salaries are Toman per month when the employer published them; contest times are UTC. Text is Persian or English as the author wrote it.
|
|
54
|
+
|
|
55
|
+
## What it can do
|
|
56
|
+
|
|
57
|
+
- **Search jobs** on Quera Magnet with the site's own filters: keyword, seniority (intern to lead), remote, city, tech stack, full/part-time/project, company, industry, sorting by newest, trending or salary
|
|
58
|
+
- **Read a job** in full: description, requirements, benefits, skills, salary, deadline and related jobs
|
|
59
|
+
- **Search companies** (3,000+) by name, city, size, industry and tech stack, and read a profile with its open jobs
|
|
60
|
+
- **List contests**: what is running or upcoming, the latest finished ones, and an archive per topic and organizer
|
|
61
|
+
- **Search problems** among about 2,000 public problems by name, topic, difficulty and source, and read the statement
|
|
62
|
+
- **Browse College courses** by learning path, level and keyword, with list prices
|
|
63
|
+
|
|
64
|
+
Example prompts:
|
|
65
|
+
|
|
66
|
+
- "Remote junior Python jobs on Quera, newest first."
|
|
67
|
+
- "Which companies in Isfahan are hiring backend developers?"
|
|
68
|
+
- "Show the open jobs and tech stack of Kaya."
|
|
69
|
+
- "Is there a Quera contest coming up? Which ones did Digikala organize?"
|
|
70
|
+
- "Easy practice problems about data structures."
|
|
71
|
+
- "Which Quera course teaches Django and how much is it?"
|
|
72
|
+
- <span dir="rtl">آگهیهای استخدام دورکاری برنامهنویس پایتون در کوئرا را نشان بده.</span>
|
|
73
|
+
|
|
74
|
+
## Quick start
|
|
75
|
+
|
|
76
|
+
You need [uv](https://docs.astral.sh/uv/getting-started/installation/). No API key or account.
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
claude mcp add quera -- uvx quera-mcp
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Claude Desktop, Cursor and other clients:
|
|
83
|
+
|
|
84
|
+
```json
|
|
85
|
+
{
|
|
86
|
+
"mcpServers": {
|
|
87
|
+
"quera": { "command": "uvx", "args": ["quera-mcp"] }
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Tools
|
|
93
|
+
|
|
94
|
+
| Tool | What it does |
|
|
95
|
+
|---|---|
|
|
96
|
+
| `qr_jobs` | Search open tech jobs (15 per page) with filters |
|
|
97
|
+
| `qr_job` | One posting in full |
|
|
98
|
+
| `qr_job_filters` | Cities, industries, company sizes and popular tech codes the filters accept |
|
|
99
|
+
| `qr_companies` | Search company profiles |
|
|
100
|
+
| `qr_company` | A company profile and its open jobs |
|
|
101
|
+
| `qr_contests` | Running, upcoming and finished contests, or the archive of one topic |
|
|
102
|
+
| `qr_problems` | Search the public problemset |
|
|
103
|
+
| `qr_problem` | One problem statement with stats |
|
|
104
|
+
| `qr_courses` | College course catalog with prices |
|
|
105
|
+
| `qr_salaries` | Published salaries in open jobs, summarized by seniority level |
|
|
106
|
+
| `qr_problem_filters` | Topic slugs and contest ids `qr_problems` accepts |
|
|
107
|
+
| `qr_event` | An event page (CodeCup, hackathon): schedule, prizes, sub-events |
|
|
108
|
+
| `qr_bootcamps` | Bootcamps open for registration with price and seats, or one in full (syllabus, instructors) |
|
|
109
|
+
| `qr_blog` | Search or read the Quera blog |
|
|
110
|
+
|
|
111
|
+
## FAQ
|
|
112
|
+
|
|
113
|
+
**Does it need a Quera account?** No. It reads the same public pages anyone sees.
|
|
114
|
+
|
|
115
|
+
**Is it official?** No. It is an independent project and is not affiliated with Quera.
|
|
116
|
+
|
|
117
|
+
**Where does it work?** Quera answers both inside and outside Iran. Set `QUERA_MCP_PROXY` if your network blocks it.
|
|
118
|
+
|
|
119
|
+
**Why are there so few jobs?** Quera Magnet is a small curated board (tens of open postings); the site's own filters decide what is listed.
|
|
120
|
+
|
|
121
|
+
## فارسی
|
|
122
|
+
|
|
123
|
+
`quera-mcp` یک سرور MCP غیررسمی و فقطخواندنی برای کوئرا (quera.org) است: جستجوی آگهیهای استخدام و شرکتها، مسابقات برنامهنویسی، مسئلههای بانک سؤال و دورههای کالج کوئرا. نیازی به حساب یا کلید API نیست.
|
|
124
|
+
|
|
125
|
+
نصب: `claude mcp add quera -- uvx quera-mcp`
|
|
126
|
+
|
|
127
|
+
## License
|
|
128
|
+
|
|
129
|
+
MIT. Author: Sepehr Radmard (سپهر رادمرد), [github.com/sepehr071](https://github.com/sepehr071), [linkedin.com/in/sepehr-radmard](https://linkedin.com/in/sepehr-radmard).
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
<!-- mcp-name: io.github.sepehr071/quera-mcp -->
|
|
2
|
+
|
|
3
|
+
# quera-mcp: Quera (کوئرا) jobs, contests, problems and courses MCP server for AI agents
|
|
4
|
+
|
|
5
|
+
**quera-mcp is an unofficial, read-only MCP server that gives AI agents the public data of Quera (quera.org), the Iranian developer platform.**
|
|
6
|
+
Its 9 tools search tech jobs and companies (Magnet), list programming contests, search and read problems from the public problemset, and browse the College course catalog.
|
|
7
|
+
No API key or Quera account is needed. It works in Claude, Cursor, Copilot and any other MCP client.
|
|
8
|
+
|
|
9
|
+
[](https://pypi.org/project/quera-mcp/)
|
|
10
|
+
[](https://pypi.org/project/quera-mcp/)
|
|
11
|
+
[](https://github.com/sepehr071/quera-mcp/blob/main/LICENSE)
|
|
12
|
+
|
|
13
|
+
[For AI agents](#for-ai-agents) · [Quick start](#quick-start) · [What it can do](#what-it-can-do) · [Tools](#tools) · [FAQ](#faq) · [فارسی](#فارسی)
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## For AI agents
|
|
18
|
+
|
|
19
|
+
- **What:** unofficial MCP server (model context protocol) for quera.org: tech job search with filters (keyword, level, remote, city, tech stack, job type, company, sort), full job postings, company search and profiles, running/upcoming/past programming contests, problem search and statements, and the College course catalog with prices.
|
|
20
|
+
- **Install:** `uvx quera-mcp` or `claude mcp add quera -- uvx quera-mcp`. Transport: stdio. Needs [uv](https://docs.astral.sh/uv/getting-started/installation/) (Python 3.10+).
|
|
21
|
+
- **Auth:** none, no API key or account. Optional `QUERA_MCP_PROXY` (HTTP proxy URL, or a comma-separated list); system proxy settings are ignored.
|
|
22
|
+
- **Access:** read-only. It cannot log in, apply to jobs, submit solutions or register for anything, so no confirmation is needed before calling any tool.
|
|
23
|
+
- **Tools:** 14, all prefixed `qr_`. Typical sequences: `qr_jobs` -> `qr_job` -> `qr_company`; `qr_companies` -> `qr_company`; `qr_problem_filters` -> `qr_problems` -> `qr_problem`; `qr_contests` -> `qr_event`; `qr_courses`; `qr_bootcamps`; `qr_blog`; `qr_salaries`.
|
|
24
|
+
- **Use when:** the user asks about developer jobs in Iran (Tehran, remote, junior, Python...), which companies hire, programming contests, practice problems, or Quera course options and prices.
|
|
25
|
+
- **Do not use when:** the user wants other job boards, personal Quera data (profiles, submissions, rankings) or to apply or submit anything.
|
|
26
|
+
- **Output:** compact JSON. Salaries are Toman per month when the employer published them; contest times are UTC. Text is Persian or English as the author wrote it.
|
|
27
|
+
|
|
28
|
+
## What it can do
|
|
29
|
+
|
|
30
|
+
- **Search jobs** on Quera Magnet with the site's own filters: keyword, seniority (intern to lead), remote, city, tech stack, full/part-time/project, company, industry, sorting by newest, trending or salary
|
|
31
|
+
- **Read a job** in full: description, requirements, benefits, skills, salary, deadline and related jobs
|
|
32
|
+
- **Search companies** (3,000+) by name, city, size, industry and tech stack, and read a profile with its open jobs
|
|
33
|
+
- **List contests**: what is running or upcoming, the latest finished ones, and an archive per topic and organizer
|
|
34
|
+
- **Search problems** among about 2,000 public problems by name, topic, difficulty and source, and read the statement
|
|
35
|
+
- **Browse College courses** by learning path, level and keyword, with list prices
|
|
36
|
+
|
|
37
|
+
Example prompts:
|
|
38
|
+
|
|
39
|
+
- "Remote junior Python jobs on Quera, newest first."
|
|
40
|
+
- "Which companies in Isfahan are hiring backend developers?"
|
|
41
|
+
- "Show the open jobs and tech stack of Kaya."
|
|
42
|
+
- "Is there a Quera contest coming up? Which ones did Digikala organize?"
|
|
43
|
+
- "Easy practice problems about data structures."
|
|
44
|
+
- "Which Quera course teaches Django and how much is it?"
|
|
45
|
+
- <span dir="rtl">آگهیهای استخدام دورکاری برنامهنویس پایتون در کوئرا را نشان بده.</span>
|
|
46
|
+
|
|
47
|
+
## Quick start
|
|
48
|
+
|
|
49
|
+
You need [uv](https://docs.astral.sh/uv/getting-started/installation/). No API key or account.
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
claude mcp add quera -- uvx quera-mcp
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Claude Desktop, Cursor and other clients:
|
|
56
|
+
|
|
57
|
+
```json
|
|
58
|
+
{
|
|
59
|
+
"mcpServers": {
|
|
60
|
+
"quera": { "command": "uvx", "args": ["quera-mcp"] }
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Tools
|
|
66
|
+
|
|
67
|
+
| Tool | What it does |
|
|
68
|
+
|---|---|
|
|
69
|
+
| `qr_jobs` | Search open tech jobs (15 per page) with filters |
|
|
70
|
+
| `qr_job` | One posting in full |
|
|
71
|
+
| `qr_job_filters` | Cities, industries, company sizes and popular tech codes the filters accept |
|
|
72
|
+
| `qr_companies` | Search company profiles |
|
|
73
|
+
| `qr_company` | A company profile and its open jobs |
|
|
74
|
+
| `qr_contests` | Running, upcoming and finished contests, or the archive of one topic |
|
|
75
|
+
| `qr_problems` | Search the public problemset |
|
|
76
|
+
| `qr_problem` | One problem statement with stats |
|
|
77
|
+
| `qr_courses` | College course catalog with prices |
|
|
78
|
+
| `qr_salaries` | Published salaries in open jobs, summarized by seniority level |
|
|
79
|
+
| `qr_problem_filters` | Topic slugs and contest ids `qr_problems` accepts |
|
|
80
|
+
| `qr_event` | An event page (CodeCup, hackathon): schedule, prizes, sub-events |
|
|
81
|
+
| `qr_bootcamps` | Bootcamps open for registration with price and seats, or one in full (syllabus, instructors) |
|
|
82
|
+
| `qr_blog` | Search or read the Quera blog |
|
|
83
|
+
|
|
84
|
+
## FAQ
|
|
85
|
+
|
|
86
|
+
**Does it need a Quera account?** No. It reads the same public pages anyone sees.
|
|
87
|
+
|
|
88
|
+
**Is it official?** No. It is an independent project and is not affiliated with Quera.
|
|
89
|
+
|
|
90
|
+
**Where does it work?** Quera answers both inside and outside Iran. Set `QUERA_MCP_PROXY` if your network blocks it.
|
|
91
|
+
|
|
92
|
+
**Why are there so few jobs?** Quera Magnet is a small curated board (tens of open postings); the site's own filters decide what is listed.
|
|
93
|
+
|
|
94
|
+
## فارسی
|
|
95
|
+
|
|
96
|
+
`quera-mcp` یک سرور MCP غیررسمی و فقطخواندنی برای کوئرا (quera.org) است: جستجوی آگهیهای استخدام و شرکتها، مسابقات برنامهنویسی، مسئلههای بانک سؤال و دورههای کالج کوئرا. نیازی به حساب یا کلید API نیست.
|
|
97
|
+
|
|
98
|
+
نصب: `claude mcp add quera -- uvx quera-mcp`
|
|
99
|
+
|
|
100
|
+
## License
|
|
101
|
+
|
|
102
|
+
MIT. Author: Sepehr Radmard (سپهر رادمرد), [github.com/sepehr071](https://github.com/sepehr071), [linkedin.com/in/sepehr-radmard](https://linkedin.com/in/sepehr-radmard).
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "quera-mcp"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
description = "Unofficial read-only MCP server for Quera (quera.org): Iranian tech jobs, companies, contests, problems and courses."
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
license = "MIT"
|
|
7
|
+
license-files = ["LICENSE"]
|
|
8
|
+
authors = [{ name = "Sepehr Radmard", email = "sepehrr80@gmail.com" }]
|
|
9
|
+
requires-python = ">=3.10"
|
|
10
|
+
keywords = ["mcp", "model-context-protocol", "quera", "quera-org", "iran", "jobs", "tech-jobs", "magnet", "programming-contests", "coding-problems", "courses", "claude", "persian"]
|
|
11
|
+
classifiers = [
|
|
12
|
+
"Development Status :: 4 - Beta",
|
|
13
|
+
"Intended Audience :: Developers",
|
|
14
|
+
"Operating System :: OS Independent",
|
|
15
|
+
"Programming Language :: Python :: 3",
|
|
16
|
+
"Programming Language :: Python :: 3.10",
|
|
17
|
+
"Programming Language :: Python :: 3.11",
|
|
18
|
+
"Programming Language :: Python :: 3.12",
|
|
19
|
+
"Programming Language :: Python :: 3.13",
|
|
20
|
+
"Topic :: Scientific/Engineering :: Artificial Intelligence",
|
|
21
|
+
]
|
|
22
|
+
dependencies = [
|
|
23
|
+
"mcp>=2.2,<3",
|
|
24
|
+
"httpx>=0.27",
|
|
25
|
+
"httpx-curl-cffi>=0.1.5",
|
|
26
|
+
"curl-cffi>=0.16.3",
|
|
27
|
+
]
|
|
28
|
+
|
|
29
|
+
[project.urls]
|
|
30
|
+
Homepage = "https://github.com/sepehr071/quera-mcp"
|
|
31
|
+
Issues = "https://github.com/sepehr071/quera-mcp/issues"
|
|
32
|
+
Website = "https://mcpfarsi.ir/"
|
|
33
|
+
|
|
34
|
+
[project.scripts]
|
|
35
|
+
quera-mcp = "quera_mcp.server:main"
|
|
36
|
+
|
|
37
|
+
[dependency-groups]
|
|
38
|
+
dev = ["pytest>=8", "ruff>=0.6"]
|
|
39
|
+
|
|
40
|
+
[build-system]
|
|
41
|
+
requires = ["hatchling"]
|
|
42
|
+
build-backend = "hatchling.build"
|
|
43
|
+
|
|
44
|
+
[tool.pytest.ini_options]
|
|
45
|
+
testpaths = ["tests"]
|
|
46
|
+
addopts = "-m 'not live'"
|
|
47
|
+
markers = ["live: calls the real Quera site (run with -m live)"]
|
|
48
|
+
|
|
49
|
+
[tool.ruff]
|
|
50
|
+
line-length = 120
|
|
51
|
+
target-version = "py310"
|
|
52
|
+
|
|
53
|
+
[tool.ruff.lint]
|
|
54
|
+
select = ["E", "F", "I", "B", "UP"]
|
|
55
|
+
ignore = ["E501"] # long Field(description=...) strings read better on one line
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
|
|
3
|
+
"name": "io.github.sepehr071/quera-mcp",
|
|
4
|
+
"title": "Quera",
|
|
5
|
+
"description": "Read-only Quera (quera.org): Iranian tech jobs, companies, contests, problems, courses and blog.",
|
|
6
|
+
"repository": {
|
|
7
|
+
"url": "https://github.com/sepehr071/quera-mcp",
|
|
8
|
+
"source": "github"
|
|
9
|
+
},
|
|
10
|
+
"websiteUrl": "https://github.com/sepehr071/quera-mcp",
|
|
11
|
+
"version": "0.1.0",
|
|
12
|
+
"packages": [
|
|
13
|
+
{
|
|
14
|
+
"registryType": "pypi",
|
|
15
|
+
"registryBaseUrl": "https://pypi.org",
|
|
16
|
+
"identifier": "quera-mcp",
|
|
17
|
+
"version": "0.1.0",
|
|
18
|
+
"runtimeHint": "uvx",
|
|
19
|
+
"transport": {
|
|
20
|
+
"type": "stdio"
|
|
21
|
+
},
|
|
22
|
+
"environmentVariables": [
|
|
23
|
+
{
|
|
24
|
+
"name": "QUERA_MCP_PROXY",
|
|
25
|
+
"description": "Optional HTTP proxy URL for the Quera requests; system proxy settings are ignored. Also accepts a comma-separated list: one is used until it gets blocked or fails to connect, then the next.",
|
|
26
|
+
"isRequired": false,
|
|
27
|
+
"isSecret": false
|
|
28
|
+
}
|
|
29
|
+
]
|
|
30
|
+
}
|
|
31
|
+
]
|
|
32
|
+
}
|