Codex · Serwer MCP
Serwer MCP dla Codex: wiadomości i e-mail w produkcie
Trzy linie w config.toml podłączają serwer Unipile MCP. Codex buduje potem w produkcie funkcje LinkedIn, WhatsApp i e-mail.
7 dni za darmo, bez karty kredytowej.
Codex · crm-app
Unipile MCP połączony
Dodaj do mojego CRM wyszukiwanie osób na LinkedIn.
Odczyt endpointuPOST /v2/{account_id}/linkedin/searchschemat wczytany
Dodano endpoint wyszukiwania i listę wyników. Każdy wiersz przechowuje ID profilu u dostawcy.
Opisz kolejną funkcję…
Zadanie
Co trzeba zrobić
Dodanie do produktu połączenia z LinkedIn, WhatsApp, e-mailem lub kalendarzem oznacza lekturę dokumentacji API, wybór właściwych endpointów, podłączenie Hosted Auth i jego callbacków, a potem pilnowanie właściwych ID od wyszukiwania po wiadomość. Z serwerem Unipile MCP w Codex agent czyta to wszystko za Państwa i pisze kod w Państwa stacku, z CLI, rozszerzenia IDE lub aplikacji desktopowej.
Podłącz serwer Unipile MCP do CodexUnipile MCP połączony
Wybierz kanały do podłączenia
developer.unipile.com/mcpPodłącz wszystkie kanały9 kanałów
↑↓nawigacja spacjawybór ↵połączjeden URL, jeden nagłówek
Bez tego
Karty, zgadywanie, kod klejący
Codex zgaduje nazwy endpointów i payloady na podstawie danych treningowych i myli ID.
Schematy z dokumentacji wkleja się do czatu ręcznie, endpoint po endpoincie.
Pierwsze prawdziwe wywołanie następuje na produkcji, już po code review.
Z serwerem Unipile MCP
Efekt w aplikacji
Endpoint połączenia i przycisk w Ustawieniach: każdy użytkownik podłącza własne konto przez Hosted Auth.
Odbiornik webhooków i inbox, który pokazuje wiadomości i e-maile na bieżąco.
Każde żądanie wykonane już raz w aplikacji Development, zanim przejrzą Państwo diff.
config.toml, CLI i IDE
Dodaj serwer Unipile MCP do Codex
Serwer jest zdalny: jeden URL przez streamable HTTP i jeden nagłówek. Bez npx, bez lokalnego procesu. Jeden wpis w config.toml czytają Codex CLI, rozszerzenie Codex do IDE i aplikacja desktopowa ChatGPT, więc konfiguruje się go raz.
Zainstalowany Codex CLI (npm i -g @openai/codex) lub rozszerzenie Codex do IDE, zalogowany.
Aplikacja Development w dashboardzie Unipile, ze Scope i kluczem Account API przypisanym do tego Scope.
Co najmniej jedno konto testowe podłączone do tego Scope przez Hosted Auth, aby agent mógł wykonywać prawdziwe żądania.
codex mcp add, potem nagłówekrejestruje URL w ~/.codex/config.toml
Konfiguracja globalna~/.codex/config.toml
Konfiguracja projektu.codex/config.toml (zaufany projekt)
Klucz ze zmiennej środowiskowejenv_http_headers
?
Dlaczego w CLI są dwa kroki?codex mcp add przyjmuje --url i zmienną z tokenem bearer, ale nie ma flagi dla własnego nagłówka. Serwer Unipile uwierzytelnia przez X-API-KEY, więc polecenie rejestruje URL, a nagłówek trafia do config.toml, ręcznie lub przez env_http_headers.
# 1. Zarejestruj hostowany serwer Unipile MCP (konfiguracja globalna)
codex mcp add unipile --url "https://developer.unipile.com/mcp?branch=v2.0"
# Added global MCP server 'unipile'.
# 2. Dodaj nagłówek X-API-KEY do wpisu w ~/.codex/config.toml
[mcp_servers.unipile]
url = "https://developer.unipile.com/mcp?branch=v2.0"
http_headers = { "X-API-KEY" = "your-scoped-api-key" }
# 3. Weryfikacja
codex mcp get unipile
[mcp_servers.unipile]
url = "https://developer.unipile.com/mcp?branch=v2.0"
http_headers = { "X-API-KEY" = "your-scoped-api-key" }
[mcp_servers.unipile]
url = "https://developer.unipile.com/mcp?branch=v2.0"
http_headers = { "X-API-KEY" = "your-scoped-api-key" }
# Czytany tylko w zaufanym projekcie. Klucz trzymaj poza git: lepiej użyć env_http_headers.
[mcp_servers.unipile]
url = "https://developer.unipile.com/mcp?branch=v2.0"
env_http_headers = { "X-API-KEY" = "UNIPILE_API_KEY" }
# export UNIPILE_API_KEY=your-scoped-api-key przed uruchomieniem codex
Zapisz plik i zrestartuj Codex. codex mcp list pokazuje unipile jako enabled, a /mcp w sesji wyświetla serwer. Sprawdzone na codex-cli 0.154.0.
Co robi każda linia, sprawdzone na codex-cli 0.154.0
codex mcp add unipileTworzy tabelę [mcp_servers.unipile] w globalnym config.toml. Nazwa jest dowolna; warto, by była krótka, bo staje się prefiksem narzędzi.--url "https://developer.unipile.com/mcp?branch=v2.0"Transport streamable HTTP. URL trzeba ująć w cudzysłów: znak zapytania to w zsh znak glob.http_headers = { "X-API-KEY" = "…" }Statyczny nagłówek wysyłany z każdym żądaniem. Należy użyć klucza Account API przypisanego do Scope, nigdy klucza Service ani globalnego klucza Account.env_http_headers = { "X-API-KEY" = "UNIPILE_API_KEY" }Ten sam nagłówek, wartość odczytywana ze środowiska przy uruchomieniu. Właściwa forma dla projektowego config.toml trzymanego w git.startup_timeout_sec = 30Opcjonalne. Domyślnie 10 s; warto podnieść, jeśli pierwszy handshake przekracza czas w wolnej sieci.enabled = falseOpcjonalne. Wyłącza serwer bez usuwania wpisu, przydatne przy przełączaniu między kluczami Development i Production.Część tylko dla Codex
Klucz API poza config.toml
http_headers zapisuje klucz otwartym tekstem w pliku, który trafia do kopii zapasowych, a w przypadku konfiguracji projektu także do git. Codex ma trzy sposoby wysyłania nagłówka X-API-KEY; wybór zależy od tego, gdzie leży plik.
1http_headers, wartość statycznaForma z dokumentacji Unipile. Dobra dla konfiguracji użytkownika na własnej maszynie, nigdy dla pliku współdzielonego w repozytorium.http_headers = { "X-API-KEY" = "your-scoped-api-key" }
2env_http_headers, odczyt przy uruchomieniuMapuje nazwę nagłówka na nazwę zmiennej środowiskowej. Plik nie zawiera sekretu, każdy developer eksportuje własny klucz przypisany do Scope. Właściwa forma dla projektowego config.toml.env_http_headers = { "X-API-KEY" = "UNIPILE_API_KEY" }
export UNIPILE_API_KEY=your-scoped-api-key
3http_headers_helper, z poleceniaLokalne polecenie, które wypisuje nagłówki jako JSON, dla zespołów pobierających klucze z sejfu. Trzeba też pamiętać o CODEX_HOME: przenosi cały katalog konfiguracji, więc serwer zapisany w jednym terminalu może nie istnieć w innym.http_headers_helper = "./scripts/unipile-headers.sh"
Weryfikacja
Sprawdzenie połączenia
Trzy testy: w CLI, w sesji, a potem z promptem, który tylko czyta specyfikację. Żaden nie dotyka podłączonego konta.
1W Codex CLIlist wypisuje po jednym wierszu na serwer z jego URL i stanem. get pokazuje transport, nagłówki i polecenie usunięcia.codex mcp list
codex mcp get unipile
2W sesjiW Codex TUI, rozszerzeniu IDE (menu z kołem zębatym, MCP servers) i aplikacji desktopowej ChatGPT (Settings, MCP servers) pojawia się ten sam wpis: jedna konfiguracja, trzy interfejsy./mcp
# Status enabled, Auth Unsupported to oczekiwany wynik: serwer używa nagłówka, a nie OAuth
3Na czacie, bez dotykania kontaWystarczy zapytać o coś, co wymaga tylko odczytu specyfikacji API. Jeśli agent odpowie prawdziwymi endpointami i parametrami, serwer jest podłączony.Korzystając z Unipile MCP, wypisz endpointy wyszukiwania osób na LinkedIn i ich wymagane parametry.
Prompty zamiast kodu klejącego
Prompt dla agenta
Trzy zadania integracyjne, a przy każdym dokładny prompt do wklejenia w Codex, endpointy Unipile, które agent czyta i wywołuje, oraz to, co trafia do projektu. Ścieżki są pełne, względem bazowego URL API
https://api.unipile.com, z kluczem przypisanym do Scope w nagłówku X-API-KEY każdego żądania.Dodaj do mojego CRM wyszukiwanie osób na LinkedIn, a potem pozwól użytkownikowi otworzyć wybrany profil i rozpocząć z niego rozmowę.
Wyszukiwanie endpointów"linkedin search people profile"3 wyniki
Wykonaj zapytaniePOST /v2/{account_id}/linkedin/search10 wyników
Dodano
GET /api/linkedin/search (słowa kluczowe, kursor paginacji) oraz GET /api/linkedin/profiles/:identifier. Lista wyników przechowuje ID dostawcy zwrócone przez wyszukiwanie, endpoint profilu używa go ponownie, a przycisk „Wiadomość” przekazuje je do utworzenia czatu. Oba uruchomione w aplikacji Development.Jeden identyfikator od wyniku wyszukiwania do rozmowy
Trudność funkcji LinkedIn nie leży w wywołaniach, tylko w zachowaniu tego samego identyfikatora od wiersza wyszukiwania, przez profil, aż po wiadomość. Codex czyta przez serwer trzy kontrakty, widzi, które pole niesie ten identyfikator w każdej odpowiedzi, i pisze endpointy tak, by nic nie było zgadywane.
Endpointy używane przez agenta
POST/v2/{account_id}/linkedin/searchGET/v2/{account_id}/users/{identifier}POST/v2/{account_id}/chats
Częsty błąd: Wyszukiwanie z jednego konta i wysyłanie wiadomości z innego. Profil i czat trzeba otworzyć na tym samym
Zbuduj integrację z LinkedIn
account_id co wyszukiwanie.Wygeneruj typowanego klienta Node.js i Python dla używanych przez nas endpointów czatów i e-maili Unipile, na podstawie schematów API, z ponawianiem przy 429.
Odczyt endpointuGET /v2/{account_id}/emailsschemat wczytany
Wykonaj zapytanieGET /v2/{account_id}/chats200 OK
Napisano
unipile-client.ts i unipile_client.py na podstawie schematów żądań i odpowiedzi: typowane metody list i send dla czatów i e-maili, helper paginacji kursorem, wykładniczy backoff przy 429 z nagłówkiem Retry-After. Oba klienty wykonały wywołania list w aplikacji Development.Typowane klienty z prawdziwych schematów, nie z pamięci
Codex nie zgaduje payloadów. Czyta przez serwer body żądania i schemat odpowiedzi każdego endpointu, generuje typy i wykonuje po jednym wywołaniu na metodę w aplikacji Development, zanim przejrzą Państwo diff. Punktem odniesienia pozostają oficjalne SDK dla Node.js i Pythona; wygenerowany klient jest Państwa i może pozostać niewielki.
Endpointy używane przez agenta
GET/v2/{account_id}/chatsPOST/v2/{account_id}/chats/{chat_id}/messages/sendGET/v2/{account_id}/emailsPOST/v2/{account_id}/emails/send
Częsty błąd: Ponawianie wysyłki po timeoucie bez sprawdzenia idempotencji. Wiadomość może wyjść tylko raz; ponawiać należy odczyty, nie zapisy.
Zobacz oficjalne SDK
Obsłuż wiele podłączonych kont dla każdego użytkownika mojego SaaS: mogą podłączyć kilka kont LinkedIn i e-mail oraz wybrać, z którego wysyłają.
Odczyt endpointuGET /v2/accountsschemat wczytany
Wykonaj zapytanieGET /v2/accounts3 konta
Dodano tabelę
accounts z kluczem według użytkownika i account_id, selektor w oknie redagowania oraz POST /api/messages wysyłający z wybranego konta. Stany ponownego połączenia z endpointu kont są pokazywane jako etykieta. Sprawdzone na trzech kontach w aplikacji Development.Jeden użytkownik, kilka kont, jeden Scope na workspace
Każde konto podłączone przez użytkowników przez Hosted Auth dostaje własne
account_id. Agent projektuje mapowanie między użytkownikami a tymi ID, czyta endpoint stanu konta, aby pokazywać stany ponownego połączenia i checkpointu, i kieruje każdą wysyłkę na konto wybrane przez użytkownika.Endpointy używane przez agenta
GET/v2/accountsGET/v2/accounts/{account_id}POST/v2/auth/linkPOST/v2/{account_id}/chats
Częsty błąd: Zapisywanie ID konta przy workspace zamiast przy użytkowniku. Konta należą do osoby, która je podłączyła; workspace tylko grupuje Scope'y i klucze.
Hosted Auth wdrożony przez agenta
Od Development do produkcji
Najpierw testy w aplikacji Development
Dashboard Unipile oddziela aplikację Development od aplikacji Production. Codex dostaje klucz przypisany do Scope z aplikacji Development i jedno lub dwa konta testowe podłączone przez Hosted Auth. Agent wykonuje prawdziwe żądania na tych kontach, w imieniu uwierzytelnionego użytkownika, który je podłączył, w granicach limitów każdego dostawcy, a konta użytkowników pozostają nietknięte aż do wdrożenia. Na etapie budowania warto ustawić
default_tools_approval_mode na prompt, jeśli każdy zapis ma być potwierdzany.Sprawdzić przepływ połączenia od początku do końca: link auth tworzony po stronie serwera, ID konta zapisane przy użytkowniku.
Sprawdzić jeden odczyt i jeden zapis na funkcję: lista czatów, wysłanie wiadomości z konta testowego.
Sprawdzić dostarczenie webhooka oraz stan ponownego połączenia lub checkpointu przed przełączeniem klucza na Production.
crm-app · DevelopmentUżywana przez Codex
Scopedev-tests · 2 konta
Klucz
klucz Account API przypisany do ScopeKontaTestowe konto LinkedIn, testowa skrzynka Gmail
Webhooki1 endpoint · zdarzenia wiadomości
crm-app · ProductionNietknięta
Scopejeden na workspace
Klucz
klucze przypisane do Scope, tylko w backendzieKontawłasne konta użytkowników, przez Hosted Auth
Rozwiązywanie problemów
Częste błędy i ich znaczenie
Co widać, gdy wpis MCP w Codex jest nieprawidłowy, i rozwiązanie dla każdego przypadku. Większość sprowadza się do pliku, składni TOML, poziomu zaufania albo klucza.
Serwer nie pojawia się po edycji config.toml
codex mcp list nic nie wyświetla albo wpisu brakuje w sesji.
RozwiązanieZrestartuj klienta: plik jest czytany przy starcie. Następnie sprawdź CODEX_HOME: przenosi cały katalog konfiguracji, więc serwer zapisany w jednym terminalu może być niewidoczny w innym. Uruchom codex mcp list w tej samej powłoce, z której uruchamiany jest Codex.
Konfiguracja projektu jest ignorowana
.codex/config.toml jest w katalogu głównym repozytorium, a Codex nadal używa wpisu globalnego albo żadnego.
RozwiązanieCodex wczytuje warstwę projektu tylko dla zaufanego projektu. Należy oznaczyć go ustawieniem trust_level = "trusted" w sekcji [projects."/path/to/repo"] w konfiguracji użytkownika albo przenieść wpis do ~/.codex/config.toml.
Niepoprawny TOML
Plik nie daje się sparsować i wszystkie serwery znikają naraz.
RozwiązaniePotrzebna jest tabela o nazwie [mcp_servers.unipile] (dokładnie tak), cudzysłów wokół "X-API-KEY" w tabeli nagłówków oraz tabela, a nie string, dla http_headers. Brak nawiasu zamykającego unieruchamia cały plik.
401 Unauthorized przy żądaniach
Serwer jest na liście i czyta specyfikację, ale wykonanie żądania kończy się błędem.
RozwiązanieBrakuje nagłówka, zmienna wskazana w env_http_headers nie jest wyeksportowana w powłoce, która uruchomiła Codex, albo klucz to klucz Service lub globalny klucz Account zamiast klucza Account API przypisanego do Scope z aplikacji Development.
Ustawienia pokazują, że serwer jest niedostępny
Rozszerzenie IDE lub aplikacja desktopowa oznacza serwer, a mimo to akcje działają.
RozwiązanieTen test szuka zasobów (resources), a serwer Unipile udostępnia akcje, a nie zasoby. Wystarczy to potwierdzić przez /mcp w sesji i wykonanie jednego wywołania odczytu. Po Państwa stronie nic nie trzeba zmieniać.
Przekroczony czas
Start lub wywołanie przekracza limit.
RozwiązanieWartości domyślne to startup_timeout_sec = 10 i tool_timeout_sec = 60. Serwer jest zdalny i nie ma procesu do uruchomienia: przed podniesieniem timeoutów należy sprawdzić URL (?branch=v2.0 włącznie), sieć i ewentualne proxy firmowe.
6000+
Firmy, które wprowadzają innowacje z Unipile
Zaufali nam liderzy branży
1 API
Usprawnij obsługę wszystkich głównych kanałów komunikacji
2 dni
Szybkie uruchomienie integracji przy minimalnej konfiguracji
30%
Mniej pracy i zasobów na utrzymanie
Wbudowane bezpieczeństwo i zgodność
Ochrona klasy enterprise dla danych i procesów Więcej o naszym bezpieczeństwie
SOC 2 Type II
Certyfikat
Niezależnie audytowane mechanizmy bezpieczeństwa, które zapewniają ochronę danych i ciągłość działania.
GDPR
Zgodność
Pełna zgodność z europejskimi przepisami o ochronie danych osobowych.
99.9%
Dostępności platformy w ciągu ostatnich 24 miesięcy
24/7
Globalne wsparcie i wydajne API
FAQ: serwer MCP w Codex
Pytania, które ludzie naprawdę wpisują: config.toml zamiast mcp.json, gdzie leży plik, codex mcp add, klucz poza plikiem, trzy interfejsy, co sprawdzić, gdy nic się nie pojawia, timeouty i klucze.
Nie. Codex przechowuje konfigurację MCP w
~/.codex/config.toml, w formacie TOML, po jednej tabeli na serwer o nazwie [mcp_servers.<name>]. W Codex nie ma pliku mcp.json, a plik nie powstaje przy instalacji: tworzy się go samodzielnie albo codex mcp add tworzy go automatycznie. Zaufany projekt może też mieć .codex/config.toml w swoim katalogu głównym.~/.codex/config.toml dla konfiguracji użytkownika, .codex/config.toml w katalogu głównym repozytorium dla konfiguracji projektu. Zmienna środowiskowa CODEX_HOME przenosi cały katalog konfiguracji: gdy serwer widać w jednym terminalu, a w innym nie, to ją należy sprawdzić najpierw. Codex CLI, rozszerzenie IDE i aplikacja desktopowa czytają ten sam plik.Częściowo.
codex mcp add unipile --url "https://developer.unipile.com/mcp?branch=v2.0" zapisuje tabelę dla serwera streamable HTTP, a --bearer-token-env-var obsługuje serwery przyjmujące token Bearer. Serwer Unipile uwierzytelnia się przez X-API-KEY jako nagłówek, a tego polecenie nie potrafi ustawić, więc do utworzonego wpisu trzeba dodać http_headers lub env_http_headers ręcznie. Sprawdzone na codex-cli 0.154.0.Używaj
env_http_headers = { "X-API-KEY" = "UNIPILE_API_KEY" }: mapuje nazwę nagłówka na nazwę zmiennej środowiskowej zamiast wartości, więc plik można zacommitować bez sekretu, a każdy developer eksportuje własny klucz Account API przypisany do Scope. http_headers służy do wartości statycznych, a http_headers_helper pozwala lokalnemu poleceniu wygenerować nagłówki jako JSON.Tak. Trzy interfejsy jednego hosta Codex czytają tę samą konfigurację, więc serwer dodany raz jest dostępny wszędzie. W aplikacji desktopowej i w rozszerzeniu można go też dodać przez Settings, MCP servers, Add server, wybierając Streamable HTTP. Po zapisaniu pliku należy zrestartować klienta.
Cztery przyczyny, po kolei: klient nie został zrestartowany; plik leży pod innym
CODEX_HOME niż bieżąca powłoka; tabela jest w projektowym .codex/config.toml a projekt nie jest oznaczony trust_level = "trusted", i wtedy Codex całkowicie pomija warstwę projektu; albo TOML jest niepoprawny. Uruchom codex mcp list, a potem /mcp w sesji.startup_timeout_sec nadpisuje domyślny 10-sekundowy timeout startu, a tool_timeout_sec domyślny 60-sekundowy timeout na narzędzie, oba w tabeli serwera. Serwer Unipile jest zdalny, działa przez HTTP i nie ma lokalnego procesu do uruchomienia, więc timeout startu prawie zawsze wskazuje na URL, sieć lub proxy firmowe, a nie na serwer.Serwer odpowiada bez klucza, gdy agent tylko czyta specyfikację API. Aby wykonywać prawdziwe żądania, należy utworzyć Scope w aplikacji Development, przypisać konta testowe i wygenerować dla tego Scope klucz Account API. Klientowi MCP nigdy nie należy dawać klucza Service ani globalnego klucza Account.