Skip to content

Commit 097e169

Browse files
feat(api): api update
1 parent 8f01f66 commit 097e169

File tree

14 files changed

+376
-37
lines changed

14 files changed

+376
-37
lines changed

.stats.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
configured_endpoints: 9
2-
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/lemma%2Flemma-17ec32fdd85f93d924b2bab3f9af3688f619999da15a92fbcc7bf6db9f479b37.yml
3-
openapi_spec_hash: 72fcd3031f757ec9289b9138fb34081f
1+
configured_endpoints: 13
2+
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/lemma%2Flemma-490b6c951dbe764981862a42c1067201cca1473d6ea2b5950d6b52246db9c455.yml
3+
openapi_spec_hash: 25f3fb0ed209b3ddd390b3b1df365f5f
44
config_hash: 017a31b2ac0856f4d4152a5173e6fa18

README.md

Lines changed: 19 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,9 @@ const client = new Lemma({
2929
apiKey: process.env['LEMMA_API_KEY'], // This is the default and can be omitted
3030
});
3131

32-
const response = await client.datasets.generateDataset({
33-
dataset_id: 'dataset_id',
34-
entries_required: 0,
35-
schema: { foo: 'bar' },
36-
});
32+
const dataset = await client.datasets.retrieve('dataset_id');
33+
34+
console.log(dataset.id);
3735
```
3836

3937
### Request & Response types
@@ -48,12 +46,7 @@ const client = new Lemma({
4846
apiKey: process.env['LEMMA_API_KEY'], // This is the default and can be omitted
4947
});
5048

51-
const params: Lemma.DatasetGenerateDatasetParams = {
52-
dataset_id: 'dataset_id',
53-
entries_required: 0,
54-
schema: { foo: 'bar' },
55-
};
56-
const response: Lemma.DatasetGenerateDatasetResponse = await client.datasets.generateDataset(params);
49+
const dataset: Lemma.Dataset = await client.datasets.retrieve('dataset_id');
5750
```
5851

5952
Documentation for each method, request param, and response field are available in docstrings and will appear on hover in most modern editors.
@@ -95,17 +88,15 @@ a subclass of `APIError` will be thrown:
9588

9689
<!-- prettier-ignore -->
9790
```ts
98-
const response = await client.datasets
99-
.generateDataset({ dataset_id: 'dataset_id', entries_required: 0, schema: { foo: 'bar' } })
100-
.catch(async (err) => {
101-
if (err instanceof Lemma.APIError) {
102-
console.log(err.status); // 400
103-
console.log(err.name); // BadRequestError
104-
console.log(err.headers); // {server: 'nginx', ...}
105-
} else {
106-
throw err;
107-
}
108-
});
91+
const dataset = await client.datasets.retrieve('dataset_id').catch(async (err) => {
92+
if (err instanceof Lemma.APIError) {
93+
console.log(err.status); // 400
94+
console.log(err.name); // BadRequestError
95+
console.log(err.headers); // {server: 'nginx', ...}
96+
} else {
97+
throw err;
98+
}
99+
});
109100
```
110101

111102
Error codes are as follows:
@@ -137,7 +128,7 @@ const client = new Lemma({
137128
});
138129

139130
// Or, configure per-request:
140-
await client.datasets.generateDataset({ dataset_id: 'dataset_id', entries_required: 0, schema: { foo: 'bar' } }, {
131+
await client.datasets.retrieve('dataset_id', {
141132
maxRetries: 5,
142133
});
143134
```
@@ -154,7 +145,7 @@ const client = new Lemma({
154145
});
155146

156147
// Override per-request:
157-
await client.datasets.generateDataset({ dataset_id: 'dataset_id', entries_required: 0, schema: { foo: 'bar' } }, {
148+
await client.datasets.retrieve('dataset_id', {
158149
timeout: 5 * 1000,
159150
});
160151
```
@@ -177,17 +168,13 @@ Unlike `.asResponse()` this method consumes the body, returning once it is parse
177168
```ts
178169
const client = new Lemma();
179170

180-
const response = await client.datasets
181-
.generateDataset({ dataset_id: 'dataset_id', entries_required: 0, schema: { foo: 'bar' } })
182-
.asResponse();
171+
const response = await client.datasets.retrieve('dataset_id').asResponse();
183172
console.log(response.headers.get('X-My-Header'));
184173
console.log(response.statusText); // access the underlying Response object
185174

186-
const { data: response, response: raw } = await client.datasets
187-
.generateDataset({ dataset_id: 'dataset_id', entries_required: 0, schema: { foo: 'bar' } })
188-
.withResponse();
175+
const { data: dataset, response: raw } = await client.datasets.retrieve('dataset_id').withResponse();
189176
console.log(raw.headers.get('X-My-Header'));
190-
console.log(response);
177+
console.log(dataset.id);
191178
```
192179

193180
### Logging
@@ -267,7 +254,7 @@ parameter. This library doesn't validate at runtime that the request matches the
267254
send will be sent as-is.
268255

269256
```ts
270-
client.datasets.generateDataset({
257+
client.datasets.retrieve({
271258
// ...
272259
// @ts-expect-error baz is not yet public
273260
baz: 'undocumented option',

api.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,19 @@
33
Types:
44

55
- <code><a href="./src/resources/datasets/datasets.ts">Dataset</a></code>
6+
- <code><a href="./src/resources/datasets/datasets.ts">DatasetListResponse</a></code>
7+
- <code><a href="./src/resources/datasets/datasets.ts">DatasetDeleteResponse</a></code>
8+
- <code><a href="./src/resources/datasets/datasets.ts">DatasetCreateDownloadURLResponse</a></code>
69
- <code><a href="./src/resources/datasets/datasets.ts">DatasetGenerateDatasetResponse</a></code>
710
- <code><a href="./src/resources/datasets/datasets.ts">DatasetGenerateSchemaResponse</a></code>
811
- <code><a href="./src/resources/datasets/datasets.ts">DatasetGenerateValidatorsResponse</a></code>
912

1013
Methods:
1114

15+
- <code title="get /datasets/{dataset_id}">client.datasets.<a href="./src/resources/datasets/datasets.ts">retrieve</a>(datasetID) -> Dataset</code>
16+
- <code title="get /datasets/">client.datasets.<a href="./src/resources/datasets/datasets.ts">list</a>({ ...params }) -> DatasetListResponse</code>
17+
- <code title="delete /datasets/{dataset_id}">client.datasets.<a href="./src/resources/datasets/datasets.ts">delete</a>(datasetID) -> DatasetDeleteResponse</code>
18+
- <code title="get /datasets/{dataset_id}/create-download-url">client.datasets.<a href="./src/resources/datasets/datasets.ts">createDownloadURL</a>(datasetID) -> string</code>
1219
- <code title="post /datasets/generate-dataset">client.datasets.<a href="./src/resources/datasets/datasets.ts">generateDataset</a>({ ...params }) -> DatasetGenerateDatasetResponse</code>
1320
- <code title="post /datasets/generate-schema">client.datasets.<a href="./src/resources/datasets/datasets.ts">generateSchema</a>({ ...params }) -> DatasetGenerateSchemaResponse</code>
1421
- <code title="post /datasets/generate-validators">client.datasets.<a href="./src/resources/datasets/datasets.ts">generateValidators</a>({ ...params }) -> DatasetGenerateValidatorsResponse</code>

packages/mcp-server/README.md

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ http://localhost:3000?client=cursor&capability=tool-name-length%3D40
187187
import { server, endpoints, init } from "lemma-mcp/server";
188188

189189
// import a specific tool
190-
import generateDatasetDatasets from "lemma-mcp/tools/datasets/generate-dataset-datasets";
190+
import retrieveDatasets from "lemma-mcp/tools/datasets/retrieve-datasets";
191191

192192
// initialize the server and all endpoints
193193
init({ server, endpoints });
@@ -212,7 +212,7 @@ const myCustomEndpoint = {
212212
};
213213

214214
// initialize the server with your custom endpoints
215-
init({ server: myServer, endpoints: [generateDatasetDatasets, myCustomEndpoint] });
215+
init({ server: myServer, endpoints: [retrieveDatasets, myCustomEndpoint] });
216216
```
217217

218218
## Available Tools
@@ -221,6 +221,23 @@ The following tools are available in this MCP server.
221221

222222
### Resource `datasets`:
223223

224+
- `retrieve_datasets` (`read`): Get a dataset by ID.
225+
226+
Retrieves a specific dataset by its ID. The dataset must belong to the
227+
specified project, which must belong to the current user's tenant.
228+
229+
- `list_datasets` (`read`): List all datasets for the specified project.
230+
231+
Retrieves all datasets that belong to the specified project.
232+
The project must belong to the current user's tenant.
233+
234+
- `delete_datasets` (`write`): Delete a dataset by ID.
235+
- `create_download_url_datasets` (`read`): Create a download URL for a dataset.
236+
237+
Creates a secure, time-limited download URL that allows downloading
238+
the dataset data. The URL can be used to access the dataset file
239+
without requiring authentication.
240+
224241
- `generate_dataset_datasets` (`write`): Generate a dataset using AI.
225242

226243
Initiates the generation of a dataset based on the provided schema and
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
import { maybeFilter } from 'lemma-mcp/filtering';
4+
import { Metadata, asTextContentResult } from 'lemma-mcp/tools/types';
5+
6+
import { Tool } from '@modelcontextprotocol/sdk/types.js';
7+
import Lemma from 'lemma';
8+
9+
export const metadata: Metadata = {
10+
resource: 'datasets',
11+
operation: 'read',
12+
tags: [],
13+
httpMethod: 'get',
14+
httpPath: '/datasets/{dataset_id}/create-download-url',
15+
operationId: 'create_download_url_datasets__dataset_id__create_download_url_get',
16+
};
17+
18+
export const tool: Tool = {
19+
name: 'create_download_url_datasets',
20+
description:
21+
"When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nCreate a download URL for a dataset.\n\nCreates a secure, time-limited download URL that allows downloading\nthe dataset data. The URL can be used to access the dataset file\nwithout requiring authentication.\n\n# Response Schema\n```json\n{\n $ref: '#/$defs/dataset_create_download_url_response',\n $defs: {\n dataset_create_download_url_response: {\n type: 'string',\n title: 'Response Create Download Url Datasets Dataset Id Create Download Url Get'\n }\n }\n}\n```",
22+
inputSchema: {
23+
type: 'object',
24+
properties: {
25+
dataset_id: {
26+
type: 'string',
27+
title: 'Dataset Id',
28+
},
29+
jq_filter: {
30+
type: 'string',
31+
title: 'jq Filter',
32+
description:
33+
'A jq filter to apply to the response to include certain fields. Consult the output schema in the tool description to see the fields that are available.\n\nFor example: to include only the `name` field in every object of a results array, you can provide ".results[].name".\n\nFor more information, see the [jq documentation](https://jqlang.org/manual/).',
34+
},
35+
},
36+
required: ['dataset_id'],
37+
},
38+
annotations: {
39+
readOnlyHint: true,
40+
},
41+
};
42+
43+
export const handler = async (client: Lemma, args: Record<string, unknown> | undefined) => {
44+
const { dataset_id, jq_filter, ...body } = args as any;
45+
return asTextContentResult(
46+
await maybeFilter(jq_filter, await client.datasets.createDownloadURL(dataset_id)),
47+
);
48+
};
49+
50+
export default { metadata, tool, handler };
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
import { maybeFilter } from 'lemma-mcp/filtering';
4+
import { Metadata, asTextContentResult } from 'lemma-mcp/tools/types';
5+
6+
import { Tool } from '@modelcontextprotocol/sdk/types.js';
7+
import Lemma from 'lemma';
8+
9+
export const metadata: Metadata = {
10+
resource: 'datasets',
11+
operation: 'write',
12+
tags: [],
13+
httpMethod: 'delete',
14+
httpPath: '/datasets/{dataset_id}',
15+
operationId: 'delete_dataset_datasets__dataset_id__delete',
16+
};
17+
18+
export const tool: Tool = {
19+
name: 'delete_datasets',
20+
description:
21+
"When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nDelete a dataset by ID.\n\n# Response Schema\n```json\n{\n $ref: '#/$defs/dataset_delete_response',\n $defs: {\n dataset_delete_response: {\n type: 'boolean',\n title: 'Response Delete Dataset Datasets Dataset Id Delete'\n }\n }\n}\n```",
22+
inputSchema: {
23+
type: 'object',
24+
properties: {
25+
dataset_id: {
26+
type: 'string',
27+
title: 'Dataset Id',
28+
},
29+
jq_filter: {
30+
type: 'string',
31+
title: 'jq Filter',
32+
description:
33+
'A jq filter to apply to the response to include certain fields. Consult the output schema in the tool description to see the fields that are available.\n\nFor example: to include only the `name` field in every object of a results array, you can provide ".results[].name".\n\nFor more information, see the [jq documentation](https://jqlang.org/manual/).',
34+
},
35+
},
36+
required: ['dataset_id'],
37+
},
38+
annotations: {
39+
idempotentHint: true,
40+
},
41+
};
42+
43+
export const handler = async (client: Lemma, args: Record<string, unknown> | undefined) => {
44+
const { dataset_id, jq_filter, ...body } = args as any;
45+
return asTextContentResult(await maybeFilter(jq_filter, await client.datasets.delete(dataset_id)));
46+
};
47+
48+
export default { metadata, tool, handler };
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
import { maybeFilter } from 'lemma-mcp/filtering';
4+
import { Metadata, asTextContentResult } from 'lemma-mcp/tools/types';
5+
6+
import { Tool } from '@modelcontextprotocol/sdk/types.js';
7+
import Lemma from 'lemma';
8+
9+
export const metadata: Metadata = {
10+
resource: 'datasets',
11+
operation: 'read',
12+
tags: [],
13+
httpMethod: 'get',
14+
httpPath: '/datasets/',
15+
operationId: 'list_datasets_datasets__get',
16+
};
17+
18+
export const tool: Tool = {
19+
name: 'list_datasets',
20+
description:
21+
"When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nList all datasets for the specified project.\n\nRetrieves all datasets that belong to the specified project.\nThe project must belong to the current user's tenant.\n\n# Response Schema\n```json\n{\n $ref: '#/$defs/dataset_list_response',\n $defs: {\n dataset_list_response: {\n type: 'array',\n title: 'Response List Datasets Datasets Get',\n items: {\n $ref: '#/$defs/dataset'\n }\n },\n dataset: {\n type: 'object',\n title: 'Dataset',\n description: 'Dataset database model.',\n properties: {\n name: {\n type: 'string',\n title: 'Name'\n },\n projectId: {\n type: 'string',\n title: 'Projectid'\n },\n id: {\n type: 'string',\n title: 'Id'\n },\n createdAt: {\n type: 'string',\n title: 'Createdat',\n description: 'Timestamp when the record was created',\n format: 'date-time'\n },\n description: {\n type: 'string',\n title: 'Description'\n },\n entries: {\n type: 'integer',\n title: 'Entries'\n },\n schema: {\n type: 'string',\n title: 'Schema'\n },\n source: {\n type: 'string',\n title: 'DatasetSourceEnum',\n enum: [ 'UPLOADED',\n 'GENERATED'\n ]\n },\n status: {\n type: 'string',\n title: 'DatasetStatus',\n enum: [ 'READY',\n 'EMPTY',\n 'GENERATING'\n ]\n },\n storageBytes: {\n type: 'integer',\n title: 'Storagebytes'\n },\n updatedAt: {\n type: 'string',\n title: 'Updatedat',\n description: 'Timestamp when the record was last updated',\n format: 'date-time'\n }\n },\n required: [ 'name',\n 'projectId'\n ]\n }\n }\n}\n```",
22+
inputSchema: {
23+
type: 'object',
24+
properties: {
25+
projectId: {
26+
type: 'string',
27+
title: 'Projectid',
28+
description: 'The ID of the project',
29+
},
30+
jq_filter: {
31+
type: 'string',
32+
title: 'jq Filter',
33+
description:
34+
'A jq filter to apply to the response to include certain fields. Consult the output schema in the tool description to see the fields that are available.\n\nFor example: to include only the `name` field in every object of a results array, you can provide ".results[].name".\n\nFor more information, see the [jq documentation](https://jqlang.org/manual/).',
35+
},
36+
},
37+
required: ['projectId'],
38+
},
39+
annotations: {
40+
readOnlyHint: true,
41+
},
42+
};
43+
44+
export const handler = async (client: Lemma, args: Record<string, unknown> | undefined) => {
45+
const { jq_filter, ...body } = args as any;
46+
return asTextContentResult(await maybeFilter(jq_filter, await client.datasets.list(body)));
47+
};
48+
49+
export default { metadata, tool, handler };
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
import { maybeFilter } from 'lemma-mcp/filtering';
4+
import { Metadata, asTextContentResult } from 'lemma-mcp/tools/types';
5+
6+
import { Tool } from '@modelcontextprotocol/sdk/types.js';
7+
import Lemma from 'lemma';
8+
9+
export const metadata: Metadata = {
10+
resource: 'datasets',
11+
operation: 'read',
12+
tags: [],
13+
httpMethod: 'get',
14+
httpPath: '/datasets/{dataset_id}',
15+
operationId: 'get_dataset_datasets__dataset_id__get',
16+
};
17+
18+
export const tool: Tool = {
19+
name: 'retrieve_datasets',
20+
description:
21+
"When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nGet a dataset by ID.\n\nRetrieves a specific dataset by its ID. The dataset must belong to the\nspecified project, which must belong to the current user's tenant.\n\n# Response Schema\n```json\n{\n $ref: '#/$defs/dataset',\n $defs: {\n dataset: {\n type: 'object',\n title: 'Dataset',\n description: 'Dataset database model.',\n properties: {\n name: {\n type: 'string',\n title: 'Name'\n },\n projectId: {\n type: 'string',\n title: 'Projectid'\n },\n id: {\n type: 'string',\n title: 'Id'\n },\n createdAt: {\n type: 'string',\n title: 'Createdat',\n description: 'Timestamp when the record was created',\n format: 'date-time'\n },\n description: {\n type: 'string',\n title: 'Description'\n },\n entries: {\n type: 'integer',\n title: 'Entries'\n },\n schema: {\n type: 'string',\n title: 'Schema'\n },\n source: {\n type: 'string',\n title: 'DatasetSourceEnum',\n enum: [ 'UPLOADED',\n 'GENERATED'\n ]\n },\n status: {\n type: 'string',\n title: 'DatasetStatus',\n enum: [ 'READY',\n 'EMPTY',\n 'GENERATING'\n ]\n },\n storageBytes: {\n type: 'integer',\n title: 'Storagebytes'\n },\n updatedAt: {\n type: 'string',\n title: 'Updatedat',\n description: 'Timestamp when the record was last updated',\n format: 'date-time'\n }\n },\n required: [ 'name',\n 'projectId'\n ]\n }\n }\n}\n```",
22+
inputSchema: {
23+
type: 'object',
24+
properties: {
25+
dataset_id: {
26+
type: 'string',
27+
title: 'Dataset Id',
28+
},
29+
jq_filter: {
30+
type: 'string',
31+
title: 'jq Filter',
32+
description:
33+
'A jq filter to apply to the response to include certain fields. Consult the output schema in the tool description to see the fields that are available.\n\nFor example: to include only the `name` field in every object of a results array, you can provide ".results[].name".\n\nFor more information, see the [jq documentation](https://jqlang.org/manual/).',
34+
},
35+
},
36+
required: ['dataset_id'],
37+
},
38+
annotations: {
39+
readOnlyHint: true,
40+
},
41+
};
42+
43+
export const handler = async (client: Lemma, args: Record<string, unknown> | undefined) => {
44+
const { dataset_id, jq_filter, ...body } = args as any;
45+
return asTextContentResult(await maybeFilter(jq_filter, await client.datasets.retrieve(dataset_id)));
46+
};
47+
48+
export default { metadata, tool, handler };

0 commit comments

Comments
 (0)