[{"data":1,"prerenderedAt":590},["ShallowReactive",2],{"docs-en-\u002Fdocs\u002Fai\u002Fdeveloper-tools":3},{"id":4,"title":5,"body":6,"description":582,"extension":583,"meta":584,"navigation":585,"path":586,"seo":587,"stem":588,"__hash__":589},"docs_en\u002Fdocs\u002Fai\u002Fdeveloper-tools.md","Developer tools",{"type":7,"value":8,"toc":575},"minimark",[9,13,17,25,30,40,130,152,163,167,181,305,312,316,367,397,412,416,425,483,497,509,516,520,557,571],[10,11,5],"h1",{"id":12},"developer-tools",[14,15,16],"p",{},"Editors and CLIs that speak MCP over HTTP take Pelyr with a bearer header. They\ndo not use the browser sign-in: Pelyr deliberately offers no dynamic client\nregistration, and the header route needs no registration at all.",[14,18,19,20,24],{},"Create a key with the ",[21,22,23],"code",{},"https"," capability in the portal first. What happens\nnext differs by client — not every one of them expands an environment variable\ninside a header the same way, so this page gives you the form each client\nactually documents rather than one block for all four.",[26,27,29],"h2",{"id":28},"cursor","Cursor",[14,31,32,35,36,39],{},[21,33,34],{},"~\u002F.cursor\u002Fmcp.json",", or ",[21,37,38],{},".cursor\u002Fmcp.json"," in the project:",[41,42,47],"pre",{"className":43,"code":44,"language":45,"meta":46,"style":46},"language-json shiki shiki-themes github-light github-dark","{\n  \"mcpServers\": {\n    \"pelyr\": {\n      \"url\": \"https:\u002F\u002Fapi.pelyr.com\u002Fmcp\",\n      \"headers\": { \"Authorization\": \"Bearer ${env:PELYR_API_KEY}\" }\n    }\n  }\n}\n","json","",[21,48,49,58,68,76,92,112,118,124],{"__ignoreMap":46},[50,51,54],"span",{"class":52,"line":53},"line",1,[50,55,57],{"class":56},"sVt8B","{\n",[50,59,61,65],{"class":52,"line":60},2,[50,62,64],{"class":63},"sj4cs","  \"mcpServers\"",[50,66,67],{"class":56},": {\n",[50,69,71,74],{"class":52,"line":70},3,[50,72,73],{"class":63},"    \"pelyr\"",[50,75,67],{"class":56},[50,77,79,82,85,89],{"class":52,"line":78},4,[50,80,81],{"class":63},"      \"url\"",[50,83,84],{"class":56},": ",[50,86,88],{"class":87},"sZZnC","\"https:\u002F\u002Fapi.pelyr.com\u002Fmcp\"",[50,90,91],{"class":56},",\n",[50,93,95,98,101,104,106,109],{"class":52,"line":94},5,[50,96,97],{"class":63},"      \"headers\"",[50,99,100],{"class":56},": { ",[50,102,103],{"class":63},"\"Authorization\"",[50,105,84],{"class":56},[50,107,108],{"class":87},"\"Bearer ${env:PELYR_API_KEY}\"",[50,110,111],{"class":56}," }\n",[50,113,115],{"class":52,"line":114},6,[50,116,117],{"class":56},"    }\n",[50,119,121],{"class":52,"line":120},7,[50,122,123],{"class":56},"  }\n",[50,125,127],{"class":52,"line":126},8,[50,128,129],{"class":56},"}\n",[41,131,135],{"className":132,"code":133,"language":134,"meta":46,"style":46},"language-bash shiki shiki-themes github-light github-dark","export PELYR_API_KEY=pk_your_key_here\n","bash",[21,136,137],{"__ignoreMap":46},[50,138,139,143,146,149],{"class":52,"line":53},[50,140,142],{"class":141},"szBVR","export",[50,144,145],{"class":56}," PELYR_API_KEY",[50,147,148],{"class":141},"=",[50,150,151],{"class":56},"pk_your_key_here\n",[14,153,154,155,158,159,162],{},"Export the variable in the shell Cursor starts from — Cursor's own docs\ndescribe ",[21,156,157],{},"${env:...}"," resolving inside ",[21,160,161],{},"headers"," for a remote server like this\none.",[26,164,166],{"id":165},"vs-code","VS Code",[14,168,169,172,173,176,177,180],{},[21,170,171],{},".vscode\u002Fmcp.json"," in the project. The object is called ",[21,174,175],{},"servers",", and each\nentry carries ",[21,178,179],{},"\"type\": \"http\"",":",[41,182,184],{"className":43,"code":183,"language":45,"meta":46,"style":46},"{\n  \"inputs\": [\n    { \"type\": \"promptString\", \"id\": \"pelyr-api-key\", \"password\": true }\n  ],\n  \"servers\": {\n    \"pelyr\": {\n      \"type\": \"http\",\n      \"url\": \"https:\u002F\u002Fapi.pelyr.com\u002Fmcp\",\n      \"headers\": { \"Authorization\": \"Bearer ${input:pelyr-api-key}\" }\n    }\n  }\n}\n",[21,185,186,190,198,234,239,246,252,264,274,290,295,300],{"__ignoreMap":46},[50,187,188],{"class":52,"line":53},[50,189,57],{"class":56},[50,191,192,195],{"class":52,"line":60},[50,193,194],{"class":63},"  \"inputs\"",[50,196,197],{"class":56},": [\n",[50,199,200,203,206,208,211,214,217,219,222,224,227,229,232],{"class":52,"line":70},[50,201,202],{"class":56},"    { ",[50,204,205],{"class":63},"\"type\"",[50,207,84],{"class":56},[50,209,210],{"class":87},"\"promptString\"",[50,212,213],{"class":56},", ",[50,215,216],{"class":63},"\"id\"",[50,218,84],{"class":56},[50,220,221],{"class":87},"\"pelyr-api-key\"",[50,223,213],{"class":56},[50,225,226],{"class":63},"\"password\"",[50,228,84],{"class":56},[50,230,231],{"class":63},"true",[50,233,111],{"class":56},[50,235,236],{"class":52,"line":78},[50,237,238],{"class":56},"  ],\n",[50,240,241,244],{"class":52,"line":94},[50,242,243],{"class":63},"  \"servers\"",[50,245,67],{"class":56},[50,247,248,250],{"class":52,"line":114},[50,249,73],{"class":63},[50,251,67],{"class":56},[50,253,254,257,259,262],{"class":52,"line":120},[50,255,256],{"class":63},"      \"type\"",[50,258,84],{"class":56},[50,260,261],{"class":87},"\"http\"",[50,263,91],{"class":56},[50,265,266,268,270,272],{"class":52,"line":126},[50,267,81],{"class":63},[50,269,84],{"class":56},[50,271,88],{"class":87},[50,273,91],{"class":56},[50,275,277,279,281,283,285,288],{"class":52,"line":276},9,[50,278,97],{"class":63},[50,280,100],{"class":56},[50,282,103],{"class":63},[50,284,84],{"class":56},[50,286,287],{"class":87},"\"Bearer ${input:pelyr-api-key}\"",[50,289,111],{"class":56},[50,291,293],{"class":52,"line":292},10,[50,294,117],{"class":56},[50,296,298],{"class":52,"line":297},11,[50,299,123],{"class":56},[50,301,303],{"class":52,"line":302},12,[50,304,129],{"class":56},[14,306,307,308,311],{},"VS Code's own recommended way to keep a header secret out of the file is an\n",[21,309,310],{},"input"," that prompts once and stores the value, not an environment-variable\nreference — see VS Code's MCP documentation for the current syntax.",[26,313,315],{"id":314},"gemini-cli","Gemini CLI",[41,317,319],{"className":132,"code":318,"language":134,"meta":46,"style":46},"export PELYR_API_KEY=pk_your_key_here\ngemini mcp add --scope user --transport http pelyr https:\u002F\u002Fapi.pelyr.com\u002Fmcp --header 'Authorization: Bearer $PELYR_API_KEY'\n",[21,320,321,331],{"__ignoreMap":46},[50,322,323,325,327,329],{"class":52,"line":53},[50,324,142],{"class":141},[50,326,145],{"class":56},[50,328,148],{"class":141},[50,330,151],{"class":56},[50,332,333,337,340,343,346,349,352,355,358,361,364],{"class":52,"line":60},[50,334,336],{"class":335},"sScJk","gemini",[50,338,339],{"class":87}," mcp",[50,341,342],{"class":87}," add",[50,344,345],{"class":63}," --scope",[50,347,348],{"class":87}," user",[50,350,351],{"class":63}," --transport",[50,353,354],{"class":87}," http",[50,356,357],{"class":87}," pelyr",[50,359,360],{"class":87}," https:\u002F\u002Fapi.pelyr.com\u002Fmcp",[50,362,363],{"class":63}," --header",[50,365,366],{"class":87}," 'Authorization: Bearer $PELYR_API_KEY'\n",[14,368,369,372,373,376,377,380,381,384,385,388,389,392,393,396],{},[21,370,371],{},"--scope user"," writes the server into ",[21,374,375],{},"~\u002F.gemini\u002Fsettings.json",". Without it,\nGemini CLI writes ",[21,378,379],{},".gemini\u002Fsettings.json"," in the current project directory, a\nfile that is easy to commit. The single quotes keep your shell from expanding\nthe reference, so the file stores the literal ",[21,382,383],{},"$PELYR_API_KEY",". Gemini CLI\nresolves ",[21,386,387],{},"$VAR"," and ",[21,390,391],{},"${VAR}"," in every string of ",[21,394,395],{},"settings.json"," when it loads\nthe settings, headers included. This command does not write the key itself\ninto the file.",[14,398,399,400,403,404,407,408,411],{},"One caveat: a later ",[21,401,402],{},"gemini mcp add"," or ",[21,405,406],{},"gemini mcp remove"," in the same scope,\nrun while ",[21,409,410],{},"PELYR_API_KEY"," is set, can write the resolved key back into the\nfile. Check the file afterwards.",[26,413,415],{"id":414},"windsurf","Windsurf",[14,417,418,421,422,180],{},[21,419,420],{},"~\u002F.codeium\u002Fwindsurf\u002Fmcp_config.json",". The URL field is called ",[21,423,424],{},"serverUrl",[41,426,428],{"className":43,"code":427,"language":45,"meta":46,"style":46},"{\n  \"mcpServers\": {\n    \"pelyr\": {\n      \"serverUrl\": \"https:\u002F\u002Fapi.pelyr.com\u002Fmcp\",\n      \"headers\": { \"Authorization\": \"Bearer ${env:PELYR_API_KEY}\" }\n    }\n  }\n}\n",[21,429,430,434,440,446,457,471,475,479],{"__ignoreMap":46},[50,431,432],{"class":52,"line":53},[50,433,57],{"class":56},[50,435,436,438],{"class":52,"line":60},[50,437,64],{"class":63},[50,439,67],{"class":56},[50,441,442,444],{"class":52,"line":70},[50,443,73],{"class":63},[50,445,67],{"class":56},[50,447,448,451,453,455],{"class":52,"line":78},[50,449,450],{"class":63},"      \"serverUrl\"",[50,452,84],{"class":56},[50,454,88],{"class":87},[50,456,91],{"class":56},[50,458,459,461,463,465,467,469],{"class":52,"line":94},[50,460,97],{"class":63},[50,462,100],{"class":56},[50,464,103],{"class":63},[50,466,84],{"class":56},[50,468,108],{"class":87},[50,470,111],{"class":56},[50,472,473],{"class":52,"line":114},[50,474,117],{"class":56},[50,476,477],{"class":52,"line":120},[50,478,123],{"class":56},[50,480,481],{"class":52,"line":126},[50,482,129],{"class":56},[41,484,485],{"className":132,"code":133,"language":134,"meta":46,"style":46},[21,486,487],{"__ignoreMap":46},[50,488,489,491,493,495],{"class":52,"line":53},[50,490,142],{"class":141},[50,492,145],{"class":56},[50,494,148],{"class":141},[50,496,151],{"class":56},[14,498,499,500,502,503,505,506,508],{},"Windsurf's own docs describe ",[21,501,157],{}," resolving inside both ",[21,504,424],{}," and\n",[21,507,161],{},".",[14,510,511,515],{},[512,513,514],"strong",{},"Never write the key into the file itself"," where the client actually\nsubstitutes a reference for you. A key that has been committed once is a key\nto revoke.",[26,517,519],{"id":518},"checking-the-connection","Checking the connection",[14,521,522,523,526,527,213,530,213,533,91,536,213,539,213,542,213,545,91,548,213,551,213,554,508],{},"Every one of these clients lists the tools of a server it connected to. ",[21,524,525],{},"pelyr","\nhas to show ten: ",[21,528,529],{},"list_sources",[21,531,532],{},"find_vessels",[21,534,535],{},"get_vessel",[21,537,538],{},"get_vessel_track",[21,540,541],{},"vessels_at_time",[21,543,544],{},"search_vessels",[21,546,547],{},"list_detection_areas",[21,549,550],{},"list_detection_overflights",[21,552,553],{},"get_detection_overflight",[21,555,556],{},"list_sts_finds",[14,558,559,560,562,563,566,567,570],{},"An empty list means the server refused the key: missing header, revoked key, or\na key without the ",[21,561,23],{}," capability. The server answers ",[21,564,565],{},"401"," in all three\ncases and says so in the ",[21,568,569],{},"WWW-Authenticate"," header; most clients show that as\n\"not authenticated\".",[572,573,574],"style",{},"html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}",{"title":46,"searchDepth":60,"depth":60,"links":576},[577,578,579,580,581],{"id":28,"depth":60,"text":29},{"id":165,"depth":60,"text":166},{"id":314,"depth":60,"text":315},{"id":414,"depth":60,"text":415},{"id":518,"depth":60,"text":519},"Configure the Pelyr MCP server in Cursor, VS Code, Gemini CLI and Windsurf.","md",{},true,"\u002Fdocs\u002Fai\u002Fdeveloper-tools",{"title":5,"description":582},"docs\u002Fai\u002Fdeveloper-tools","LEGoHhsZT0hIbWqz_UvlE_AQXicgNZ25ncReER_yFPM",1793034560948]