Skip to content

Commit 1fba373

Browse files
committed
feat: Implement GetLTP and GetOHLC tools
1 parent 9e0a4e9 commit 1fba373

File tree

3 files changed

+116
-2
lines changed

3 files changed

+116
-2
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,8 @@ If you want to use the hosted version, you can use the following config:
133133
| **Market Data Methods** | | |
134134
| `GetQuote()` | [x] | Implemented as `get_quotes` tool |
135135
| `GetHistoricalData()` | [x] | Implemented as `get_historical_data` tool |
136-
| `GetLTP()` | [ ] | Not yet implemented |
137-
| `GetOHLC()` | [ ] | Not yet implemented |
136+
| `GetLTP()` | [x] | Implemented as `get_ltp` tool |
137+
| `GetOHLC()` | [x] | Implemented as `get_ohlc` tool |
138138
| `GetInstruments()` | [-] | Won't implement. Use `instruments_search` tool. |
139139
| `GetInstrumentsByExchange()` | [-] | Won't implement |
140140
| `GetAuctionInstruments()` | [ ] | Not yet implemented |

mcp/market_tools.go

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,3 +258,115 @@ func (*HistoricalDataTool) Handler(manager *kc.Manager) server.ToolHandlerFunc {
258258
}, nil
259259
}
260260
}
261+
262+
type LTPTool struct{}
263+
264+
func (*LTPTool) Tool() mcp.Tool {
265+
return mcp.NewTool("get_ltp",
266+
mcp.WithDescription("Get latest trading prices for a list of instruments"),
267+
mcp.WithArray("instruments",
268+
mcp.Description("Eg. ['NSE:INFY', 'NSE:SBIN']. This API returns the lastest price for the given list of instruments in the format of exchange:tradingsymbol."),
269+
mcp.Required(),
270+
mcp.Items(map[string]any{
271+
"type": "string",
272+
}),
273+
),
274+
)
275+
}
276+
277+
func (*LTPTool) Handler(manager *kc.Manager) server.ToolHandlerFunc {
278+
return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
279+
sess := server.ClientSessionFromContext(ctx)
280+
281+
kc, err := manager.GetSession(sess.SessionID())
282+
if err != nil {
283+
log.Println("error getting session for LTP", err)
284+
return nil, err
285+
}
286+
287+
args := request.GetArguments()
288+
289+
instruments := assertStringArray(args["instruments"])
290+
if len(instruments) == 0 {
291+
return nil, errors.New("at least one instrument must be specified")
292+
}
293+
294+
ltp, err := kc.Kite.Client.GetLTP(instruments...)
295+
if err != nil {
296+
log.Println("error getting LTP", err)
297+
return nil, err
298+
}
299+
300+
v, err := json.Marshal(ltp)
301+
if err != nil {
302+
log.Println("error marshalling LTP data", err)
303+
return nil, err
304+
}
305+
306+
ltpJSON := string(v)
307+
return &mcp.CallToolResult{
308+
Content: []mcp.Content{
309+
mcp.TextContent{
310+
Type: "text",
311+
Text: ltpJSON,
312+
},
313+
},
314+
}, nil
315+
}
316+
}
317+
318+
type OHLCTool struct{}
319+
320+
func (*OHLCTool) Tool() mcp.Tool {
321+
return mcp.NewTool("get_ohlc",
322+
mcp.WithDescription("Get OHLC (Open, High, Low, Close) data for a list of instruments"),
323+
mcp.WithArray("instruments",
324+
mcp.Description("Eg. ['NSE:INFY', 'NSE:SBIN']. This API returns OHLC data for the given list of instruments in the format of exchange:tradingsymbol."),
325+
mcp.Required(),
326+
mcp.Items(map[string]any{
327+
"type": "string",
328+
}),
329+
),
330+
)
331+
}
332+
333+
func (*OHLCTool) Handler(manager *kc.Manager) server.ToolHandlerFunc {
334+
return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
335+
sess := server.ClientSessionFromContext(ctx)
336+
337+
kc, err := manager.GetSession(sess.SessionID())
338+
if err != nil {
339+
log.Println("error getting session for OHLC", err)
340+
return nil, err
341+
}
342+
343+
args := request.GetArguments()
344+
345+
instruments := assertStringArray(args["instruments"])
346+
if len(instruments) == 0 {
347+
return nil, errors.New("at least one instrument must be specified")
348+
}
349+
350+
ohlc, err := kc.Kite.Client.GetOHLC(instruments...)
351+
if err != nil {
352+
log.Println("error getting OHLC", err)
353+
return nil, err
354+
}
355+
356+
v, err := json.Marshal(ohlc)
357+
if err != nil {
358+
log.Println("error marshalling OHLC data", err)
359+
return nil, err
360+
}
361+
362+
ohlcJSON := string(v)
363+
return &mcp.CallToolResult{
364+
Content: []mcp.Content{
365+
mcp.TextContent{
366+
Type: "text",
367+
Text: ohlcJSON,
368+
},
369+
},
370+
}, nil
371+
}
372+
}

mcp/mcp.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ var (
3131
&QuotesTool{},
3232
&InstrumentsSearchTool{},
3333
&HistoricalDataTool{},
34+
&LTPTool{},
35+
&OHLCTool{},
3436

3537
// Tools that post data to Kite Connect
3638
&PlaceOrderTool{},

0 commit comments

Comments
 (0)