프로토타입 · 미리 보기: 공식 레지스트리의 모든 서버를 담고 있으며 30분마다 동기화해요. 리뷰와 계정 기능은 다음 단계에서 열려요.
PopNx MCPAI를 쓰는 사람을 위한 MCP 서버 · 쉬운 말로 설명해요

Partelisto

제작자: TargetGrps버전 1.1.0i★ –i클라우드에서 실행
레지스트리 이름io.github.TargetGrps/partelisto-mcp

설치

개요

제작자가 쓴 설명(영어 원문)

Guest check-in, SES.HOSPEDAJES status, and booking creation for Spanish vacation rentals. No PII.

PopNx MCP의 세 기둥

이 세 가지는 절대 하나의 점수로 합치지 않아요. 의견, 측정, 인기는 서로 다른 것이니까요.

할 수 있는 일

이 서버는 아직 쉬운 말로 된 요약을 쓰지 못했어요. 아래는 레지스트리에서 읽어 온 사실이에요.

  • 연결 방식: 클라우드에서 실행
  • 전송 방식: Streamable HTTP
  • 카테고리: 기타

설치

쓰고 있는 AI 앱을 고른 다음 설정을 복사하세요.

설치하기 전에

  • 기본 점검: 1개 중 1개 통과
  • 제작자의 서버에서 실행돼요. 내가 요청한 내용은 제작자의 서버를 거쳐요.
  • 레지스트리에 입력해야 할 키가 나와 있지 않아요.

필요한 것

어떤 앱을 쓰세요?

위에서 앱을 고르세요. 기억해 두었다가 다음부터는 버튼에 “…에 설치”라고 표시해요.

웹, 데스크톱, 모바일의 Claude에서 쓸 수 있어요:

  1. Settings → Connectors 열기
  2. Add custom connector 누르기
  3. 아래 주소를 붙여 넣고 Add 누르기
  4. 로그인하라고 하면 제작자의 서비스에 로그인하기
SettingsConnectors1+ Add2https://…3
https://mcp.partelisto.es/mcp

터미널에서 이 명령어를 실행하세요

claude mcp add --transport http partelisto https://mcp.partelisto.es/mcp

Cursor에서 열기

또는 설정을 직접 복사하기

프로젝트의 .cursor/mcp.json 또는 ~/.cursor/mcp.json에 붙여 넣으세요

{
  "mcpServers": {
    "partelisto": {
      "url": "https://mcp.partelisto.es/mcp"
    }
  }
}

브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.

VS Code에서 열기

또는 설정을 직접 복사하기

프로젝트의 .vscode/mcp.json에 붙여 넣으세요

{
  "servers": {
    "partelisto": {
      "type": "http",
      "url": "https://mcp.partelisto.es/mcp"
    }
  }
}

브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.

ChatGPT는 인터넷에 있는 서버에만 연결할 수 있어요:

  1. 웹에서 ChatGPT 열기 → Settings → Connectors (Apps)
  2. Create 또는 Add 누르기(일부 요금제는 먼저 Advanced에서 Developer mode를 켜야 해요)
  3. 아래 주소를 붙여 넣고 이름을 정한 뒤 저장하기
  4. 로그인하라고 하면 제작자의 서비스에 로그인하기
SettingsConnectors1+ Create2https://…3
https://mcp.partelisto.es/mcp

메뉴 이름은 요금제나 시기에 따라 조금 다를 수 있어요.

선택한 앱은 이 기기의 쿠키에만 저장돼요. 계정은 필요 없어요.

이 설정은 제작자의 레지스트리 정보로 만들었어요. README와 다르면 README를 따르세요.

할 수 있는 일

아직 이 서버의 도구 목록을 읽지 않았어요. 엔드포인트는 차례대로 돌아가며 점검해요.

기본 점검i

누구나 볼 수 있는 정보를 점검했고, 코드는 읽지 않았어요. 해당하지 않는 항목은 개수에서 뺐어요. · 2026년 11월 7일 점검

  • ✓ 통과

    제작자와 저장소 일치

    레지스트리 이름이 GitHub 계정 TargetGrps 기준으로 확인되었고, 이 계정이 저장소를 소유하고 있어요

  • … 아직 점검 안 함

    계속 관리되고 있음

    아직 GitHub에서 이 저장소를 읽어 오지 않았어요

  • … 아직 점검 안 함

    라이선스 있음

    아직 GitHub에서 이 저장소를 읽어 오지 않았어요

  • … 아직 점검 안 함

    엔드포인트 응답

    아직 점검하지 않았어요. 엔드포인트는 차례대로 돌아가며 점검해요

  • … 아직 점검 안 함

    OAuth로 로그인

    아직 점검하지 않았어요. 엔드포인트는 차례대로 돌아가며 점검해요

  • … 아직 점검 안 함

    도구 설명에 숨겨진 지시 없음

    아직 점검하지 않았어요. 엔드포인트를 점검할 때 도구 목록을 읽어요

기타 카테고리의 다른 서버와 비교i

  • 이 카테고리의 다른 서버 32684개 중 0%보다 스타가 많아요
  • 이 카테고리의 다른 서버 32684개 중 32%보다 최근에 레지스트리에 공개됐어요
  • 기본 점검 결과가 이 카테고리의 다른 서버 32684개 중 100%와 같거나 더 좋아요

레지스트리에서 이 카테고리의 활성 서버 전체와 비교했어요. 스타는 게시자가 저장소를 소유한 경우에만 세요.

자주 묻는 질문

Partelisto, 안전한가요?

해당하는 기본 점검 1개 중 1개를 통과했어요. 코드는 읽지 않았어요. 키나 토큰을 넣기 전에 서버가 어떤 권한을 요구하는지 확인하고, 꼭 필요한 권한만 있는 키를 쓰세요.

어떤 키나 코드가 필요한가요?

레지스트리에 필수 키가 나와 있지 않아요. 다만 처음 쓸 때 로그인을 요구하는 서버도 있어요.

내 컴퓨터에서 실행되나요, 클라우드에서 실행되나요?

제작자의 클라우드에서 실행돼요. 설치 없이 인터넷으로 연결하지만, 보내는 내용은 제작자의 서버를 거쳐요.

아직 관리되고 있나요?

GitHub 저장소는 마지막으로 – 변경됐고, 최신 버전(1.1.0)은 2개월 전 레지스트리에 올라왔어요.

어떤 앱에서 쓸 수 있나요?

Claude Desktop, Claude Code, Cursor, VS Code처럼 MCP를 지원하는 앱에서 쓸 수 있어요. URL로 연결되기 때문에, 원격 MCP 서버를 지원하는 앱(예: 개발자 모드의 ChatGPT)에서도 쓸 수 있어요.

대신 쓸 수 있는 건 뭐가 있나요?

같은 카테고리에는: Spec Driven Development, Remote Desktop Commander, Master CSS

대안

같은 카테고리에서 다른 제작자가 만든 서버예요. 스타 순으로 정렬했어요.

카드 보는 법:★ GitHub 스타i세 기둥: 리뷰 · 점검 · 사용 정도i업데이트 = 최신 버전을 레지스트리에 공개한 날i

Spec Driven Development

제작자: formulahendry

MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.

내 컴퓨터에서 실행★ 440MIT14개월 전 업데이트
설치

Remote Desktop Commander

제작자: desktop-commander

Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.

클라우드에서 실행★ 211그저께 업데이트
설치

Master CSS

제작자: master-co

Inspect Master CSS classes, generated CSS, and project stylesheets from your AI client.

내 컴퓨터에서 실행오늘 업데이트
설치

제작자의 README

README 열기

제작자의 저장소에서 쓰인 그대로 가져왔어요. PopNx MCP가 검토하거나 보증한 내용이 아니에요. HTML, 이미지, 스크립트는 제거했어요. 링크를 누르면 이 사이트를 벗어나요.

Partelisto MCP

SES.HOSPEDAJES and guest check-in for Spanish vacation rentals, exposed to AI agents.

A remote MCP server that lets Claude, ChatGPT, or any MCP-compatible AI agent answer operational questions about a signed-in host's Spanish accommodation — which arrivals still have an incomplete guest form, which bookings failed SES.HOSPEDAJES (police registration) submission, how close the account is to its plan limit — and, with a separately granted permission, resend a guest's check-in link. It adds no business logic of its own: every tool is a thin wrapper over one query or mutation that already exists on the api-gateway, gated exactly the way the web app is.

Tools: list_properties · list_bookings · get_guest_form_status · list_ses_statuses · get_usage_summary · get_attention_required · send_guest_checkin_link · create_booking (the last two need the extra partelisto:write scope — see the Tools table below for what each one wraps).

Example prompts: "What needs my attention today?" · "Which of today's arrivals still have an incomplete guest form?" · "Show me bookings where SES.HOSPEDAJES submission failed." · "Create a booking for Casa Sol, 12–15 September, guest Ana García." · "Resend the check-in link for booking X."

No guest PII (email, phone, passport/DNI, date of birth, nationality, document content) is ever selected or returned by any tool — see Tools (v1) below.

Claude / ChatGPT / Copilot

│ MCP over HTTP, Bearer token from Keycloak OAuth ▼ partelisto-mcp (this service) │ same GraphQL call the SPA would make, same Bearer token forwarded as-is ▼ api-gateway → backoffice / booking / guestdocs

Why it deviates from the usual service-structure template

Every other TargetGrps service owns data (MongoDB, tenancy middleware, ApiServiceBootstrapper). This one doesn't — it has no Domain layer and no database. It's a client of the gateway, not a peer of it. The project layout keeps Application (DTOs, the fixed GraphQL documents, and the pure response-shaping/redaction logic) and Infrastructure (the gateway HTTP client) for the same testability reasons the template exists, but skips Mongo/multitenancy bootstrap because there's nothing to bootstrap.

Tools (v1)

ToolScopeWraps
list_propertiespartelisto:readproperties
list_bookingspartelisto:readbookingsPage (skip/take only — no filter yet, see below)
get_guest_form_statuspartelisto:readsubmissionStatus
list_ses_statusespartelisto:readsesSubmissionStatuses
get_usage_summarypartelisto:readpartelistoUsageInfo
get_attention_requiredpartelisto:readbookingsPage + sesSubmissionStatuses, composed client-side — no new query. Scans the 50 most recent bookings; imminent/current stays with an incomplete guest form, plus any failed SES submission.
send_guest_checkin_linkpartelisto:writesendGuestLink mutation — emails the guest, rotates their link
create_bookingpartelisto:writecreateBooking mutation. Auto-resolves templateId via templates(propertyId) when the property has exactly one active template; otherwise asks the caller to pick one. Does not send the check-in link — call send_guest_checkin_link separately for that.

None of these ever select or return guest email, phone, passport/DNI, date of birth, nationality, or document content — see GatewayQueries (what's selected) and ResponseShaper (what's mapped into the DTO). GatewayQueriesTests fails the build if a query is ever widened to select a field that looks like PII, as a second line of defense.

list_bookings doesn't yet expose BookingsQuery.BookingFilter (propertyId/date range/status) because its GraphQL input type name is generated by HotChocolate's mutation-conventions and wasn't worth guessing blind — add it once the gateway schema can be introspected against directly.

Authorization — two independent layers

  1. Scope, checked in this service (PartelistoTools.RequireScope): the bearer token's JWT scope claim must contain partelisto:read for the five read tools, partelisto:write additionally for send_guest_checkin_link. The token is validated (signature, issuer, expiry) against Keycloak by the standard AddJwtBearer handler in Program.cs — this service does real JWT verification, it does not trust an unverified claim. This is what lets an OAuth consent screen offer "read my data" separately from "send email on my behalf."
  2. Ownership/tenant, enforced by the api-gateway on every call, same as for the web app: the raw bearer token is forwarded unchanged, and the gateway's OwnerAccess policy decides what data that specific user may see. A valid partelisto:write scope does not by itself grant access to any particular booking — the gateway still checks the caller owns it.

RFC 9728 protected-resource metadata is published at /.well-known/oauth-protected-resource, pointing authorization_servers at Keycloak's realm and listing both scopes, so a spec-compliant MCP client can discover how to obtain a token without a human pasting one in.

Keycloak setup (done)

The partelisto realm has a client partelisto-mcp (uuid f5a1cb7f-d6f9-474c-818a-183584dbec30): public client, standardFlowEnabled (authorization_code + PKCE), consentRequired: true, directAccessGrantsEnabled: true. Two optional client scopes are assigned and shown on the consent screen: partelisto:read and partelisto:write (both display.on.consent.screen: true). Two access token audience mappers are attached to the client — one adding partelisto-mcp (so this service accepts the token), one adding api-gateway (so the same token, forwarded unchanged, is also accepted by the gateway; the first mapper alone replaces the audience rather than extending it, which silently broke the gateway hop — worth remembering if another audience mapper gets added here later).

Registered redirect URIs: https://claude.ai/api/mcp/auth_callback and https://chatgpt.com/connector_platform_oauth_redirect. Add more (Claude Code's local callback, etc.) as each client actually gets connected — Keycloak needs the exact URI before that client's OAuth flow will complete.

Two more fixes were needed, found only by testing against a real signed-in Claude.ai session (browser, not curl) with a real (non-e2e) Partelisto account:

  • `fullScopeAllowed` was `false` on the `partelisto-mcp` client (Keycloak's default for a client created via the Admin API). With it off, the issued token's realm_access.roles contained only offline_access — none of the user's actual roles — regardless of what the user actually had. Fixed by setting it to true (already true on partelisto-spa; brings this client in line with that).
  • Missing the `oidc-usermodel-realm-role-mapper` protocol mapper (name "realm roles", claim name roles) that partelisto-spa has directly on the client. TargetGrps.BuildingBlocks.Bootstrapper's JWT setup sets RoleClaimType = "http://schemas.microsoft.com/ws/2008/06/identity/claims/role" and never maps realm_access.roles into that claim type itself (confirmed by decompiling the installed NuGet package — its OnTokenValidated handler only logs claims) — so RequireRole(...) policies like OwnerAccess fail for *any* client missing this exact mapper, no matter what roles the user has or what realm_access contains. Copied verbatim from partelisto-spa's mapper config onto partelisto-mcp.

Verified end to end with a real signed-in Claude.ai session, not just curl: added the custom connector, completed the full browser OAuth + consent flow (both scopes shown and granted separately, confirming the two-scope design renders correctly), had list_properties fail twice with the two bugs above, fixed both live, reconnected, and got a real answer back from backoffice through the whole chain (gateway → backoffice → GraphQL → this service → Claude). This is now the most-verified path in the whole project — the only thing left unverified is a ChatGPT connection specifically.

Deployed

Live at https://mcp.partelisto.es — k8s/deployment.yaml applied directly (kubectl apply -f k8s/, not Helm; see that file's header comment for why), image ghcr.io/targetgrps/partelisto-mcp, namespace targetgrps-microservices. CI (.github/workflows/build-publish.yml) builds, tests, and pushes on every push to main. Bump the image: tag in k8s/deployment.yaml and re-apply for future releases.

CI is self-contained — it does not call targetgrps/reusable-workflows the way every sibling service's build-publish.yml does. That repo is private, and this one is deliberately public (see "Made public" below); a public repository cannot call a reusable workflow in a private one at all — GitHub rejects it at dispatch time ("workflow was not found"), independent of that repo's access-level setting. The reusable workflow's other features (npm/nuget client publish, a Mongo image, Slack notify) don't apply to this service anyway, so a small inline workflow was the right call, not a workaround. Also needed GH_TOKEN_TARGETGRPS (not secrets.GITHUB_TOKEN) to log in to GHCR — the package was first pushed with a personal token during initial rollout, so this repo's own Actions identity was never on its "Manage Actions access" list (a GHCR setting with no REST API to fix remotely).

Two bugs found and fixed only by actually deploying, not by local docker run/docker compose:

  • dotnet publish --no-build -o /app was publishing into the same directory the source tree already occupied, which silently drops Content items (appsettings.json). The image had no config at all and crashed on startup with Keycloak:Authority is not configured. Fixed by publishing to /out instead.
  • request.Scheme read http behind the TLS-terminating ingress, so /.well-known/oauth-protected-resource reported "resource": "http://mcp.partelisto.es". Fixed with UseForwardedHeaders.

Also hit and fixed as part of this rollout, outside this repo: cert-manager 1.18.2 in this cluster couldn't issue any new TLS certificate (an upstream bug with ingress-nginx's strict path validation — cert-manager#7791). Patched by adding --feature-gates=ACMEHTTP01IngressPathTypeExact=false to the cert-manager Deployment's args in the cert-manager namespace — the documented workaround, reverting to pre-1.18 behavior. This was blocking certificate issuance cluster-wide, not just for this service.

Verified live over real HTTPS: /healthz, /.well-known/oauth-protected-resource (correct https:// resource and both scopes listed), and the MCP initialize handshake.

Listed in the official MCP registry

io.github.TargetGrps/partelisto-mcp is live and active at registry.modelcontextprotocol.io — verify with curl "https://registry.modelcontextprotocol.io/v0.1/servers?search=partelisto-mcp". Published by .github/workflows/publish-mcp-registry.yml on every push to main that touches server.json, via GitHub Actions OIDC — no login, no stored token, nobody approves anything by hand. The namespace has to match the org's exact casing (TargetGrps, not targetgrps) or the registry's OIDC check 403s.

What's NOT done yet (manual follow-ups)

  • Not submitted to the ChatGPT App directory. Unlike the MCP registry, there's no OIDC/CI path for this — OpenAI's submission flow is a human review process behind a developer-account login: verify the production /mcp URL, verify the domain, provide reviewer credentials for t

앞부분만 보여 드려요. 나머지는 저장소에서 읽어 보세요

PopNx에게 묻기