docyrus-api-dev について
`@docyrus/api-client` と `@docyrus/signin` でアプリを Docyrus API に接続する開発者向けスキルです。OAuth2 認証、データソースのクエリ、REST エンドポイント、アクセス制御を扱います。
主な機能
- 01OAuth2 PKCE 認証
- 02React 認証プロバイダーとフック
- 03データのフィルター、ソート、ページネーション
- 04集計、数式、ピボット
- 05REST アクションと ACL エンドポイント
活用シーン
- 01React アプリに Docyrus ログインを追加
- 02テナントのデータソースをクエリ
- 03集計を含むフィルターレポートの作成
- 04レコード共有とロール操作の管理
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ docyrus/ agent-skills --skill docyrus-api-devインストール後、Claude Code で/docyrus-api-devを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/api-client.mdauthentication.mddata-source-query-guide.mdformula-design-guide-llm.mdquery-and-formulas.md詳細
Docyrus API 開発者向け
@docyrus/api-client(REST クライアント)と @docyrus/signin(React 認証プロバイダー)を使用して Docyrus API と連携します。OAuth2 PKCE で認証し、強力なフィルタリングや集計機能を使ってデータソースをクエリし、REST エンドポイントを利用できます。
認証のクイックスタート
React アプリ — @docyrus/signin を使用
import { DocyrusAuthProvider, useDocyrusAuth, useDocyrusClient, SignInButton } from '@docyrus/signin'
// 1. Wrap root
<DocyrusAuthProvider
apiUrl={import.meta.env.VITE_API_BASE_URL}
clientId={import.meta.env.VITE_OAUTH2_CLIENT_ID}
redirectUri={import.meta.env.VITE_OAUTH2_REDIRECT_URI}
scopes={['offline_access', 'Read.All', 'DS.ReadWrite.All', 'Users.Read']}
callbackPath="/auth/callback"
>
<App />
</DocyrusAuthProvider>
// 2. Use hooks
function App() {
const { status, signOut } = useDocyrusAuth()
const client = useDocyrusClient() // RestApiClient | null
if (status === 'loading') return <Spinner />
if (status === 'unauthenticated') return <SignInButton />
// client is ready — make API calls
const user = await client!.get('/v1/users/me')
}
React 以外/サーバー — OAuth2Client を直接使用
import { RestApiClient, OAuth2Client, OAuth2TokenManagerAdapter, BrowserOAuth2TokenStorage } from '@docyrus/api-client'
const tokenStorage = new BrowserOAuth2TokenStorage(localStorage)
const oauth2 = new OAuth2Client({
baseURL: 'https://api.docyrus.com',
clientId: 'your-client-id',
redirectUri: 'http://localhost:3000/callback',
usePKCE: true,
tokenStorage,
})
// Auth Code flow
const { url } = await oauth2.getAuthorizationUrl({ scope: 'openid offline_access Users.Read' })
window.location.href = url
// After redirect:
const tokens = await oauth2.handleCallback(window.location.href)
// Create API client with auto-refresh
const client = new RestApiClient({
baseURL: 'https://api.docyrus.com',
tokenManager: new OAuth2TokenManagerAdapter(tokenStorage, async () => {
return (await oauth2.refreshAccessToken()).accessToken
}),
})
API エンドポイント
データソース項目(テナントごとに異なります)
GET /v1/apps/{appSlug}/data-sources/{slug}/items — List with query payload
GET /v1/apps/{appSlug}/data-sources/{slug}/items/{id} — Get one
POST /v1/apps/{appSlug}/data-sources/{slug}/items — Create
PATCH /v1/apps/{appSlug}/data-sources/{slug}/items/{id} — Update
DELETE /v1/apps/{appSlug}/data-sources/{slug}/items/{id} — Delete one
DELETE /v1/apps/{appSlug}/data-sources/{slug}/items — Delete many (body: { recordIds })
エンドポイントは、テナントでデータソースが定義されている場合にのみ存在します。テナントの OpenAPI 仕様は GET /v1/api/openapi.json で確認してください。
システムエンドポイント(常に利用可能)
GET /v1/users — List users
POST /v1/users — Create user
GET /v1/users/me — Current user profile
PATCH /v1/users/me — Update current user
コネクターの検出と外部リクエストのエンドポイント
GET /v1/connectors?q=&limit=&offset= — List connectors with keyword search
GET /v1/connectors/{dataProviderSlug} — Get connector detail (dataSources + actions)
GET /v1/connectors/{dataProviderSlug}/actions/{actionKey} — Get action detail (input/output schemas, API endpoint)
GET /v1/connectors/{dataProviderSlug}/connections — Get tenant connections + user connection status
PUT /v1/connectors/{dataProviderSlug} — Send HTTP request through connector provider auth
スコープ:Read.All、ReadWrite.All、または Connectors.Read.All。PUT エンドポイントには ReadWrite.All が必要です。
コネクター経由でリクエストを送信するための PUT リクエストボディ:
{
"endpoint": "relative/path/or/absolute-url",
"requestMethod": "GET",
"data": { "fields": "id,name", "limit": 20 },
"contentType": "application/json",
"headers": { "Authorization": "Bearer <override-token>" },
"connectionId": "optional-tenant-connection-uuid",
"connectionAccountId": "optional-connection-account-uuid"
}
コネクターは、プロバイダー設定と保存済みの接続から認証情報(OAuth トークン、ベース URL)を解決します。カスタムの headers.Authorization は、保存済みのトークンを上書きします。
アクション実行エンドポイント
GET /v1/apps/base/actions — List base actions
GET /v1/apps/{appSlug}/actions/{actionSlug} — Get action metadata
POST /v1/apps/{appSlug}/actions/{actionSlug}/run — Run action directly
アクションの実行では、任意の JSON ボディを入力として受け付けます。省略可能なヘッダー:x-connection-id、x-connection-account-id。
ACL/ロール管理エンドポイント
GET /v1/users/acl?dataSourceId={uuid}&recordId={uuid} — Read record ACL rows
POST /v1/users/acl/share — Upsert record shares
DELETE /v1/users/acl/share — Revoke record shares
PUT /v1/users/acl/owner — Transfer record ownership
GET /v1/users/acl/roles — List roles
GET /v1/users/acl/roles/{roleId} — Get one role
POST /v1/users/acl/roles — Create role
PATCH /v1/users/acl/roles/{roleId} — Update role
DELETE /v1/users/acl/roles/{roleId} — Delete role
GET /v1/users/acl/user-roles — List user-role assignments
GET /v1/users/acl/users/{userId}/roles — List one user's roles
POST /v1/users/acl/users/{userId}/roles — Add roles to a user
PUT /v1/users/acl/users/{userId}/roles — Replace a user's full role set
DELETE /v1/users/acl/users/{userId}/roles/{roleId} — Remove one role assignment
GET /v1/users/acl/role-queries — List role queries
GET /v1/users/acl/role-queries/{roleQueryId} — Get one role query
POST /v1/users/acl/role-queries — Create role query
PATCH /v1/users/acl/role-queries/{roleQueryId} — Update role query
DELETE /v1/users/acl/role-queries/{roleQueryId} — Delete role query
ACL ルートでは通常の認証済み API セッションが必要ですが、バックエンドが現在これらを公開ドキュメントから除外しているため、生成された Swagger/OpenAPI 出力に表示されない場合があります。レコード共有、ロールの CRUD、ユーザーへのロール割り当ての管理、またはロールクエリの管理が必要な場合は、RestApiClient を直接呼び出して連携してください。
すべての ACL ロール操作では、API が返すロールの uid 値を使用してください。ネストされたロールオブジェクトには id と uid の両方が含まれ、どちらもロールの UID 値に対応します。
ACL の設定(ロールの作成、操作レベルの権限の割り当て、ロールクエリと組織階層の構築)には、docyrus-acl-design スキル(
docyrus acl …)を使用してください。上記のエンドポイントは、アプリ/フロントエンド連携のための実行時 REST インターフェースです。
API 呼び出し
// List items with query payload
const items = await client.get('/v1/apps/base/data-sources/project/items', {
columns: 'name, status, record_owner(firstname,lastname)',
filters: { rules: [{ field: 'status', operator: '!=', value: 'archived' }] },
orderBy: 'created_on DESC',
limit: 50,
})
// Get single item
const item = await client.get('/v1/apps/base/data-sources/project/items/uuid-here', {
columns: 'name, description, status',
})
// Create
const newItem = await client.post('/v1/apps/base/data-sources/project/items', {
name: 'New Project',
status: 'status-enum-id',
})
// Update
await client.patch('/v1/apps/base/data-sources/project/items/uuid-here', {
name: 'Updated Name',
})
// Delete
await client.delete('/v1/apps/base/data-sources/project/items/uuid-here')
クエリペイロードの概要
GET items エンドポイントでは、強力なクエリペイロードを受け付けます。
| 機能 | 目的 |
|---|---|
columns | フィールドの選択、リレーションの展開 field(subfields)、別名の指定 alias:field、スプレッド ...field() |
filters | 50 種類以上の演算子(比較、日付ショートカット、ユーザー関連)を使ったネストされた AND/OR グループ |
filterKeyword | 検索可能なすべてのフィールドを対象とした全文検索 |
orderBy | 関連フィールドを含むフィールドでの、方向を指定した並べ替え |
limit/offset | ページネーション(デフォルトの limit:100) |
fullCount | 結果とともに一致する総件数を返す |
calculations | グループ化に対応した集計:count、sum、avg、min、max |
formulas | 計算される仮想列(単純な関数、ブロック AST、相関サブクエリ) |
childQueries | 関連する子レコードをネストされた JSON 配列として取得 |
pivot | 日付範囲の系列に対応したクロス集計マトリックスクエリ |
expand | リレーション/ユーザー/列挙型フィールドについて、ID の代わりに完全なオブジェクトを返す |
クエリと数式の詳細なリファレンスについては、以下を参照してください:
references/data-source-query-guide.mdreferences/formula-design-guide-llm.md
重要なルール
- list/get 呼び出しでは、必ず
columnsを送信してください。指定しない場合、idのみが返されます。 - データソースのエンドポイントは動的です。テナントで定義されているデータソースに対してのみ存在します。
countの計算にはidフィールドを使用してください。sum、avg、min、maxには実際のフィールドスラッグを使用してください。- 子クエリのキーは
columnsに含める必要があります。childQuery のキーがordersの場合、ordersを columns に含めてください。 - 数式のキーは
columnsに含める必要があります。数式のキーがtotalの場合、totalを columns に含めてください。 - 関連フィールドで絞り込む場合は、
rel_{{relation_field}}/{{field}}の構文を使用してください。 - ACL のルートは、生成された OpenAPI から隠れている場合があります。生成されたコレクションのサポートを期待するのではなく、
RestApiClientを使って直接呼び出してください。 - ACL のロール書き込み、ユーザーロールの
roleIds、およびロールクエリのroleIdsには、ロールのuid値を優先して使用してください。 PUT /v1/users/acl/users/:userId/rolesは全置換、POST /v1/users/acl/users/:userId/rolesは追加として扱ってください。- ロールクエリの
queryは生の JSON として送信し、該当する場合はバックエンドがdataSourceIdからtenantAppIdを導出するようにしてください。 - ロールを削除した後は、依存する ACL の状態を更新してください。ロール一覧、ユーザーロール一覧、ロールクエリ一覧、およびプライマリロールのラベルを表示している UI が対象です。
参考資料
詳しい情報が必要な場合は、以下のファイルを参照してください。
references/api-client.md— RestApiClient の全 API、OAuth2Client(PKCE、クライアントクレデンシャル、デバイスコードの全フロー)、トークンマネージャー、インターセプター、エラークラス、SSE/ストリーミング、ファイルのアップロード/ダウンロード、HTML から PDF への変換、再試行ロジックreferences/authentication.md— @docyrus/signin の React プロバイダー、useDocyrusAuth/useDocyrusClient フック、hasRole/hasPermission 認可ヘルパー、SignInButton、スタンドアロン認証と iframe 認証のモード、環境変数、API クライアントへのアクセスパターンreferences/data-source-query-guide.md— 最新のクエリペイロードガイド:columns、filters、orderBy、ページネーション、計算、数式、子クエリ、ピボット、演算子のリファレンスreferences/formula-design-guide-llm.md—formulasペイロードの作成と検証に関する最新の数式設計ガイド