Add Employed by Guaq AI (hosted job-search MCP) to the integrations catalog
Maintainers usually reply within 1 day
Assessment
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Newbie friendliness
- 62/100
Research direction
Start from the shape of integrations/catalog/atlassian-rovo.json and check it against integrations/catalog.schema.json, then add integrations/catalog/employed.json with the oauth2 none client-auth option and no hardcoded OAuth URLs. Run npm run build:integrations to regenerate integrations/catalog-index.js. Done when the pytest files named in the issue pass and the entry is returned by listIntegrationCatalog() and get_integration_catalog_entry_model("employed"). The implementation is also tracked in #768, so check that before starting.
Written by the indexing model from the issue text.
Description
Request
Add Employed by Guaq AI to the integrations catalog (integrations/catalog/) so it appears on the OpenHands MCP page next to the other hosted MCP servers.
None of the current catalog entries covers job search or hiring data. An agent can research companies on the web, but it has no structured source of live job postings: roles it can filter by seniority, location, work mode, technology or visa signal, with each one linking to the employer's own apply page. It also has no way to read an employer's current hiring mix. This entry fills that gap for job-hunting and hiring-research tasks.
What Employed's MCP server provides
- Server: a hosted Streamable HTTP MCP server at
https://jobs.guaqai.me/mcp. It indexes live postings read directly from about 5,000 employers' own applicant-tracking systems (Greenhouse, Lever, Workday, Ashby, SmartRecruiters and others). - Read-only tools:
search_jobs,count_jobsandget_job;list_companiesandcompany_profile(seniority mix, functions, cities, technologies, longest-open roles);market_signal, plusapi_metafor the filter vocabulary.
- Account tools for the signed-in user's own profile, application tracker and alerts. They change only that user's data, and never apply to jobs or contact employers.
- Auth: OAuth 2.1.
- An unauthenticated request returns
401withWWW-Authenticate: Bearer resource_metadata="https://jobs.guaqai.me/.well-known/oauth-protected-resource/mcp". - That metadata names
https://jobs.guaqai.meas the authorization server. - The authorization server's metadata advertises a
registration_endpoint,code_challenge_methods_supported: ["S256"]andtoken_endpoint_auth_methods_supportedincludingnone, so a public client registers itself with no pre-shared credentials.
- An unauthenticated request returns
Proposed catalog entry
One new file, integrations/catalog/employed.json, with a single oauth connection option: strategy: oauth2, clientAuthentication: none, and no hardcoded authorization, token or registration URLs, on an shttp transport. It matches the shape used by atlassian-rovo and granola. integrations/catalog-index.js is regenerated with npm run build:integrations, and no other files change. The implementation is in #768.
integrations/catalog/employed.json
{
"id": "employed",
"name": "Employed by Guaq AI",
"description": "Search live job postings read from about 5,000 employers' own applicant-tracking systems, research an employer's hiring, and brief a hiring market.",
"categories": [
"Jobs",
"Research"
],
"appUrl": "https://jobs.guaqai.me",
"docsUrl": "https://jobs.guaqai.me/connectors",
"notes": "OAuth 2.1 with dynamic client registration is handled by the hosted Employed MCP server; no client credentials are needed. Search tools are read-only; account tools change only the signed-in user's own profile, application tracker and alerts, and never apply to jobs or contact employers.",
"installHint": "Sign in with an Employed account when the authentication flow starts; a free account is enough to start.",
"iconBg": "#CCFF33",
"iconColor": "#14110F",
"logoUrl": "https://jobs.guaqai.me/assets/brand/icon-512.png",
"keywords": [
"jobs",
"job-search",
"hiring",
"careers",
"internships",
"ats",
"recruiting",
"mcp"
],
"connectionOptions": [
{
"id": "oauth",
"provider": "mcp",
"transport": {
"kind": "shttp",
"url": "https://jobs.guaqai.me/mcp"
},
"auth": {
"strategy": "oauth2",
"oauth": {
"clientAuthentication": "none"
}
}
}
]
}
Verification
pytest tests/test_catalog_schema.py tests/test_integration_catalog_in_sync.py tests/test_catalogs.py: 117 passed.- The discovery chain above was checked live against the server.
Docs: https://jobs.guaqai.me/connectors. Privacy policy: https://jobs.guaqai.me/privacy-policy.
OpenHands AI triage
The following comments and acceptance criteria were added by the OpenHands AI agent.
Scope
Add one hosted-OAuth MCP entry, integrations/catalog/employed.json, for Employed by Guaq AI: MCP over Streamable HTTP at https://jobs.guaqai.me/mcp, auth.strategy oauth2 with oauth.clientAuthentication none, and no hardcoded authorization, token, or registration URLs. Regenerate integrations/catalog-index.js with npm run build:integrations. The single hand-authored JSON file is the source of truth; the regenerated JS index is the only derived artifact.
Non-goals
No changes to OpenHands apps, Agent Canvas, the SDK, or any runtime/connection code; no second connection option, API-key fallback, or scope list; no edits to the catalog schema, integrations/README.md, or unrelated entries. Implementation is tracked in PR #768 and is out of scope for this triage.
Acceptance Criteria
-
integrations/catalog/employed.jsonexists with"id": "employed"matching its filename and carriesname,description, anddocsUrl. - The entry validates against
integrations/catalog.schema.jsonunderDraft202012Validator, including the cross-field rule that anmcpoption requires atransportand must not carryhttp. - Its single connection option is
id: "oauth",provider: "mcp",transport.kind: "shttp",transport.url: "https://jobs.guaqai.me/mcp",auth.strategy: "oauth2", andauth.oauth.clientAuthentication: "none", with no hardcodedauthorizationUrl,tokenUrl, orregistrationUrl. -
integrations/catalog-index.jsis regenerated (npm run build:integrations) to statically import./catalog/employed.json, and no aggregateintegration-catalog.jsonis introduced. - The entry is returned by both JS (
listIntegrationCatalog(),getIntegrationCatalogEntry("employed")) and Python (list_integration_catalog_models(),get_integration_catalog_entry_model("employed")), appears under themcp=trueandoauth=truefilters, and carries no derived fields such assupportsMcporsupportsOauth. -
docsUrlandlogoUrlarehttps://URLs that resolve (both currently return HTTP 200). -
uv run --with-editable . --with pytest --with jsonschema pytest tests/test_catalog_schema.py tests/test_integration_catalog_in_sync.py tests/test_catalogs.pypasses with the new entry present.
- Dominant language
- Python
- Stars
- 172
- Forks
- 117
- Avg merge
- 1d 20h
- Merged PRs (30d)
- 65
Getting set up
- No Dockerfile or Docker Compose file
- Has a pull request template
- No contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from OpenHands/extensions
-
priority:low
Difficulty 2/5 1-3 hours Newbie friendliness 65/100
OpenHands/extensions#829 · 1 comment ·
Maintainers usually reply within 1 day
-
Add Spicrawl web-scraping MCP catalogue entryPossibly taken @DibbayajyotiRoy claimed this 9 days ago. Openpriority:low ready-for-dev
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
OpenHands/extensions#738 ·
Maintainers usually reply within 1 day
-
Add IsMalicious threat-intelligence MCP catalogue entryPossibly taken A pull request linked to this issue is open or already merged. Openpriority:low ready-for-dev
Difficulty 2/5 1-3 hours Newbie friendliness 86/100
OpenHands/extensions#721 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 86/100
OpenHands/extensions#605 · 2 comments ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
OpenHands/extensions#575 · 2 comments ·
Maintainers usually reply within 1 day
All issues in OpenHands/extensions
Similar issues
-
type-bug
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
Maintainers usually reply within 1 day
-
push_gh-pages fails on master branch on forksPossibly taken A pull request linked to this issue is open or already merged. Opengood first issue infrastructure
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
kuznia-rdzeni/coreblocks#1135 ·
-
good first issue server
Difficulty 2/5 1-3 hours Newbie friendliness 85/100
Maintainers usually reply within 1 day
-
documentation priority: high
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
a-lex-s/mealie-telegram-bot#54 ·
Maintainers usually reply within 1 day